Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
.csv a .html
#1
Hola a todos, 

Tengo que crear un programa que haga lo siguiente: 

1. Importar un archivo .csv a petición del usuario.
2. Que imprima en pantalla los datos del archivo .csv en un tabla
3. Que muestre errores, por ejemplo "el archivo . csv no se encuentra" vuelva a introducir el nombre de un archivo exportable. 
4. Que exporte los datos .csv a un archivo .html en formato de tabla.
5. Que muestre posibles errores. 

De momento he creado lo siguiente: ¿Cómo lo veis? ¿Se puede mejorar o utilizar otras funciones de python?



print ("                         De .CSV a .HTML                      ")
print ("                                                                            ")
 
try:
nombre_csv = raw_input ("Introduzca el nombre del archivo que desea abrir: ") #El usuario decide el archivo que importa

archivo_csv= open((nombre_csv+'.csv')) #Python abre el archivo seleccionado por el usuario

contenido = archivo_csv.read () #Leyendo el archivo .csv

print 'Nombre     ''Apellido1     ' 'Apellido2     ' 'mail     '
print contenido #Imprime el contenido del archivo en pantalla

print raw_input ('Si los datos son correctos pulse enter para continuar')
nombre_html = raw_input ("Introduzca el nombre del archivo para guardar los datos en formato .html:")
archivo_html = open ((nombre_html+'.html'),"w")
 
except IOError:
print 'El archivo', (nombre_csv), 'no existe'
Responder
#2
Hola, está todo muy bien. Se me ocurre que para el punto 4 puedes hacer algo como lo siguiente:

  1. archivo_html = open(nombre_html+".html", "a")
  2. archivo_html.write("<html><table>")
  3.  
  4. # Separar el archivo en líneas.
  5. for linea in contenido.split("\n"):
  6. archivo_html.write("<tr>")
  7. # Separar los valores por comas.
  8. for columna in linea.split(","):
  9. archivo_html.write("<td>")
  10. archivo_html.write(columna)
  11. archivo_html.write("</td>")
  12. archivo_html.write("</tr>")
  13.  
  14. archivo_html.write("</table></html>")


Saludos!
Responder
#3
Hola, 

Con tus indicaciones está casi perfecto...Me faltarían dos cosas que no se como las puedo hacer. 

1. Si pongo un archivo .csv que no existe salta correctamente el mensaje El archivo (nombre del archivo introducido) no existe. Me gustaría que me diera de nuevo la opción de introducir otro nombre de archivo. 

2. Cuando imprime por primera vez los datos del archivo .csv me gustaría que saliera en pantalla más alineado. 

3. Cuando abro el archivo .html ya creado con los datos de .csv me gustaría poner encima en negrita Nombre, apellido1, apellido 2 y e-mail y que saliera una tabla.

¿Cómo puedo hacer todo esto?

Muchísimas gracias por la ayuda, ya me estaba volviendo un poco loco. Dejo todo que código que he escrito. 
Código:
print ("                         De .CSV a .HTML                      ")
print ("                                                                            ")

try:
    nombre_csv = raw_input ("Introduzca el nombre del archivo que desea abrir: ") #El usuario decide el archivo que importa
    archivo_csv= open((nombre_csv+'.csv')) #Python abre el archivo seleccionado por el usuario
    contenido = archivo_csv.read () #Leyendo el archivo .csv
    print 'Nombre     ''Apellido1     ' 'Apellido2     ' 'mail     '
    print contenido #Imprime el contenido del archivo en pantalla
    print raw_input ('Si los datos son correctos pulse enter para continuar')
    nombre_html = raw_input ("Introduzca el nombre del archivo para guardar los datos en formato .html:")
    archivo_html = open ((nombre_html+'.html'),"a")
    archivo_html.write("<html><table>")
# Separar el archivo en lineas.
    for linea in contenido.split("\n"):
        archivo_html.write("<tr>")
   # Separar los valores por comas.
        for columna in linea.split(","):
            archivo_html.write("<td>")
            archivo_html.write(columna)
            archivo_html.write("</td>")
        archivo_html.write("</tr>")
    archivo_html.write("</table></html>")
except IOError:
    print 'El archivo', (nombre_csv), 'no existe'
Responder
#4
Bien, en el primer caso podrías hacer algo como lo siguiente, haciendo uso de la función estándar os.path.exists() para determinar si el fichero ingresado existe.

  1. from os.path import exists
  2.  
  3. nombre_csv = ""
  4. while not exists(nombre_csv):
  5. nombre_csv = raw_input("Introduzca el nombre del archivo que desea abrir: ")
  6.  
  7. archivo_csv = open((nombre_csv+'.csv'))
  8. # ...


Esto es más conveniente que capturar IOError, ya que esta excepción podría lanzarse por alguna otra razón (por ejemplo, que el archivo exista pero esté bloqueado por otro programa).

Imprimir los valores en pantalla de forma alineada es un tanto más complicado pues no hay ninguna función estándar que haga eso automáticamente. En este enlace tienes un código que puede hacerlo.

Por último, para añadir los nombres de las columnas puedes colocar lo siguiente antes del bucle:

  1. archivo_html.write("""\
  2. <thead>
  3. <th>Nombre</th>
  4. <th>Apellido 1</th>
  5. <th>Apellido 2</th>
  6. <th>E-mail</th>
  7. </thead>
  8. """)


Saludos
Responder
#5
Perfecto lo de las tablas de .html ¡Muchas gracias! y muchas gracias también por la información para imprimir en pantalla los datos alineados.

Lo que no me ha quedado muy claro es donde va insertado from os.path import exists y todo el resto del código dentro de mi código.

Un saludo y muchas gracias.
Responder
#6
Hola, me alegro que te haya servido. El código debería quedarte más o menos así (no incluyo la parte de las columnas en HTML):

  1. from os.path import exists
  2.  
  3. print (" De .CSV a .HTML ")
  4. print (" ")
  5.  
  6. nombre_csv = ""
  7. while not exists(nombre_csv):
  8. nombre_csv = raw_input("Introduzca el nombre del archivo que desea abrir: ")
  9.  
  10. archivo_csv = open((nombre_csv+'.csv'))
  11.  
  12. contenido = archivo_csv.read () #Leyendo el archivo .csv
  13. print 'Nombre ''Apellido1 ' 'Apellido2 ' 'mail '
  14. print contenido #Imprime el contenido del archivo en pantalla
  15. print raw_input ('Si los datos son correctos pulse enter para continuar')
  16. nombre_html = raw_input ("Introduzca el nombre del archivo para guardar los datos en formato .html:")
  17. archivo_html = open ((nombre_html+'.html'),"a")
  18. archivo_html.write("<html><table>")
  19. # Separar el archivo en lineas.
  20. for linea in contenido.split("\n"):
  21. archivo_html.write("<tr>")
  22. # Separar los valores por comas.
  23. for columna in linea.split(","):
  24. archivo_html.write("<td>")
  25. archivo_html.write(columna)
  26. archivo_html.write("</td>")
  27. archivo_html.write("</tr>")
  28. archivo_html.write("</table></html>")


Saludos
Responder
#7
Ok, muchas gracias. Un saludo.
Responder
#8
Hola, 

A parte del código que hemos estado tratando he intentado hacer las cosas de otra forma, pero me quedan dos cosas que no se como insertar en mi código:

1. Imprimir los datos importados de .csv.

2. Que aparezca algo así como "introduzca el nombre del archivo .html

El código es el siguiente. 
Código:
# /usr/bin/env python
# -*- coding: utf-8 -*-

import csv
from string import Template

html_template = Template("""
<!DOCTYPE html>
<html lang="es">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>$title</title>
   <style>
       * {margin: 0; padding: 0; font-size: 16px; box-sizing: border-box;}
       body {font-family: Helvetica, sans-serif; color: #212121}
       table {border-collapse: collapse; width: 100%;}
       table, td {border: 1px solid #acacac;}
       td { padding: .3rem;}
       .datasheet {max-width: 960px; width: 100%; margin: 1rem auto;
       overflow: auto;}
   </style>
</head>
<body>
   <div class="datasheet">
       <table>$content</table>
   </div>
</body>
</html>""")


def csv_to_html(csv_file, dest_filename='index.html', title='Document'):
   """ Convierte un archivo csv a una tabla en formato html. """

   with open(csv_file, mode='r') as f:
       # detecto el dialecto utilizado por el archivo
       dialect = csv.Sniffer().sniff(f.read(1024))
       f.seek(0)
       csv_reader = csv.reader(f, dialect)

       rows = ''
       for line in csv_reader:
           cols = ''
           for field in line:
               cols += '<td>{}</td>'.format(field)
           rows += '<tr>{}</tr>'.format(cols)

   # creo el archivo html
   with open(dest_filename, mode='w') as f:
       content = html_template.substitute(title=title, content=rows)
       f.write(content)


try:
   nombre_csv = raw_input('Introduzca el nombre del archivo que desea abrir: ')
   csv_to_html(nombre_csv)
except IOError:
   print 'El archivo %s no existe' % nombre_csv
Responder
#9
Hola. Ya que dentro de tu función csv_to_html() estás recorriendo línea por línea, puedes aprovechar para imprimirlas en pantalla:

  1. for line in csv_reader:
  2. print line
  3. cols = ''
  4. # ...


¿Qué otro problemas tienes con el código?

Saludos
Responder
#10
Muchisimas gracias por toda la ayuda y tu atención. Con este código está todo resuelto. Pero creo que usaré otro hilo porque es otro código diferente. 

Un saludo
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)