Mensajes: 12
Temas: 2
Registro en: Dec 2017
Reputación:
0
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'
Mensajes: 1.299
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola, está todo muy bien. Se me ocurre que para el punto 4 puedes hacer algo como lo siguiente:
Código: archivo_html = open(nombre_html+".html", "a")
archivo_html.write("<html><table>")
# Separar el archivo en líneas.
for linea in contenido.split("
"):
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>")
Saludos!
Mensajes: 12
Temas: 2
Registro en: Dec 2017
Reputación:
0
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'
Mensajes: 1.299
Temas: 3
Registro en: Feb 2016
Reputación:
71
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.
Código: from os.path import exists
nombre_csv = ""
while not exists(nombre_csv):
nombre_csv = raw_input("Introduzca el nombre del archivo que desea abrir: ")
archivo_csv = open((nombre_csv+'.csv'))
# ...
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:
Código: archivo_html.write("""\r
<thead>
<th>Nombre</th>
<th>Apellido 1</th>
<th>Apellido 2</th>
<th>E-mail</th>
</thead>
""")
Saludos
Mensajes: 12
Temas: 2
Registro en: Dec 2017
Reputación:
0
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.
Mensajes: 1.299
Temas: 3
Registro en: Feb 2016
Reputación:
71
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):
Código: from os.path import exists
print (" De .CSV a .HTML ")
print (" ")
nombre_csv = ""
while not exists(nombre_csv):
nombre_csv = raw_input("Introduzca el nombre del archivo que desea abrir: ")
archivo_csv = open((nombre_csv+'.csv'))
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("
"):
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>")
Saludos
Mensajes: 12
Temas: 2
Registro en: Dec 2017
Reputación:
0
Ok, muchas gracias. Un saludo.
Mensajes: 12
Temas: 2
Registro en: Dec 2017
Reputación:
0
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
Mensajes: 1.299
Temas: 3
Registro en: Feb 2016
Reputación:
71
13-12-2017, 05:59 PM
(Última modificación: 13-12-2017, 06:00 PM por Francisco.)
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:
Código: for line in csv_reader:
print line
cols = ''
# ...
¿Qué otro problemas tienes con el código?
Saludos
Mensajes: 12
Temas: 2
Registro en: Dec 2017
Reputación:
0
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
|