<div dir="ltr"><div><div><div><div><div><div><div><div><div>Puedes usar el módulo codecs para abrir un fichero indicándole la codificación a usar. Por ejemplo, si tienes un fichero en iso-8859-1 y quieres salvarlo como utf-8, puedes hacer:<br>

<br></div>import codecs<br></div>fin = codecs.open('entrada.txt', 'rb', encoding='iso-8859-1')<br></div>fout = codecs.open('saluda.txt', 'wb', encoding='utf-8')<br></div>for linea in fin.readlines():<br>

</div>    fout.write(linea)<br></div>fout.close()<br></div>fin.close()<br><br>Con el fichero abierto de esa manera, puedes (y debes :-)) trabajar en unicode, él hace las conversiones necesarias de forma transparente. Este código, si el fichero pepe.py está correctamente codificando en utf-8, vemos que las líneas son todas unicode :<br>

<br></div>import codecs<br>for l in codecs.open('pepe.py', encoding='utf-8'):<br></div>    print type(l)<br><div><br><br><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">

2013/5/28 Leandro E. Colombo Viña <span dir="ltr"><<a href="mailto:colomboleandro@gmail.com" target="_blank">colomboleandro@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">Mis queridos, buen día y....<br><div><br><span style="font-family:courier new,monospace">#!/usr/bin/env python<br></span></div><div><span style="font-family:courier new,monospace"><br>print("Hola Mundo!!!!")</span><br>


<br></div><div>Aprovecho para mandarles una consulta que hace días no me deja avanzar. Tengo que hacer un script que necesito que lea un CSV (exportado de una hoja de Excel) y complete con esos datos un formulario PDF. <br>


Para eso estoy usando <b>fdfgen</b> para con los datos leídos del CSV construir un FDF y con eso combinar los datos finalmente usando <b>pdftk</b>. Hasta ahora eso no ha sido gran problema. Puedo leer un CSV de prueba, construir el FDF y armar el PDF. <br>


<br>Entonces, cuál es el problema?!<br><br></div><div>Justamente, la codificación de los datos. El Excel me exporta el CSV en <i>iso-8859-1</i> (a.k.a. <i>latin-1</i>) y ya intenté usando en el script las instrucciones de <a href="http://www.python.org/dev/peps/pep-0263/" target="_blank">http://www.python.org/dev/peps/pep-0263/</a> pero no tuve éxito. Evidentemente estoy haciendo algo mal y no puedo encontrar qué es.<br>


<br></div><div>Les paso el script:<br></div><div><br>

<p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">#!/usr/bin/env python</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"># -*- coding: iso-8859-1 -*-</span></p><span style="font-family:courier new,monospace"><br></span><p style="margin:0px;text-indent:0px">


<span style="font-family:courier new,monospace">from fdfgen import forge_fdf</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">import os</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">import sys</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">import csv</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">sys.path.insert(0, os.getcwd())</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">csv_file = "Nómina.csv"</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">pdf_file = "Nómina-Formulario.pdf"</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">tmp_file = "tmp.fdf"</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">output_folder = './output/'</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">def process_csv(file):</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    headers = []</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    data = []</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    csv_data = csv.reader(open(file))</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    for i, row in enumerate(csv_data):</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        if i == 0:</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">            headers = row</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">            print ((("Los encabezados del archivo son:") + str(headers)))</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">            continue</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        field = []</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        for i in range(len(headers)):</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">            field.append((str(headers[i]) + str(row[0]), row[i]))</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">            print(field)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        data.append(field)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    return data</span></p><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">def form_fill(fields, j):</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    print((("Leyendo la entrada: ") + str(fields)))</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    fdf = forge_fdf("", fields, [], [], [])</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    fdf_file = open(tmp_file, "w")</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    fdf_file.write(fdf)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    fdf_file.close()</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    output_file = '{0}COMPLETO-{2}-{1}'.format(output_folder, pdf_file, j)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    aux_file = '{0}COMPLETO-{2}-{1}'.format(output_folder, pdf_file, j - 1)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    remove_file = '{0}COMPLETO-{2}-{1}'.format(output_folder, pdf_file, j - 2)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    if j == 0:</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        print("Creando el primer archivo")</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        cmd = 'pdftk "{0}" fill_form "{1}" output "{2}" dont_ask'.format(pdf_file, tmp_file, output_file)</span></p>


<span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    else:</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        print((("Escribiendo {0} con los datos de {1} en {2}.").format(aux_file, tmp_file, output_file)))</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        cmd = 'pdftk "{0}" fill_form "{1}" output "{2}" dont_ask'.format(aux_file, tmp_file, output_file)</span></p>


<span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        if j >= 2:</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">            os.remove(remove_file)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    os.system(cmd)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    os.remove(tmp_file)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">data = process_csv(csv_file)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">print ("\nDatos leídos del archivo {0}:\n").format(csv_file)</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">print data</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">print("\n\tSe leyeron: ") + repr(len(data)) + " registros.\n"</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace"><br></span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">if len(data) > 78:</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    print("ERROR: El archivo de datos origen tiene demasiados registros.")</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    print("La Nómina como máximo se 78 entradas.")</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    print("Por favor, corrija los datos de entrada y vuelva a ejecutarlo.")</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">else:</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    j = 0</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    print('Generando Formulario Completo:')</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    print('------------------------------')</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">    for i in data:</span></p><span style="font-family:courier new,monospace"></span>                <span style="font-family:courier new,monospace">form_fill(i, j)</span><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><span style="font-family:courier new,monospace">        j = j + 1</span></p><span style="font-family:courier new,monospace">
</span><p style="margin:0px;text-indent:0px"><br></p>A todos los que hayan llegado hasta acá, ya les agradezco por haberme leído! Y a los que me respondan les agradezco de antemano!!!!<br></div><div>Saludos!<br>LEO.<br><br>


</div></div>
<br>_______________________________________________<br>
pyar mailing list <a href="mailto:pyar@python.org.ar">pyar@python.org.ar</a><br>
<a href="http://listas.python.org.ar/listinfo/pyar" target="_blank">http://listas.python.org.ar/listinfo/pyar</a><br>
<br>
PyAr - Python Argentina - Sitio web: <a href="http://www.python.org.ar/" target="_blank">http://www.python.org.ar/</a><br>
<br>
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - <a href="http://www.usla.org.ar" target="_blank">http://www.usla.org.ar</a><br></blockquote></div><br><br clear="all"><br>-- <br>Juan Ignacio Rodríguez de León<br>


Móvil: 605 890514<br>
E-Mail: <a href="mailto:euribates@gmail.com" target="_blank">euribates@gmail.com</a><br>

<a href="http://www.metriz.com/" target="_blank">http://www.metriz.com/</a><br>
<a href="http://descon2.com/" target="_blank">http://descon2.com/</a><br>

<a href="http://www.elornitorrincoenmascarado.com/" target="_blank">http://www.elornitorrincoenmascarado.com/</a>
</div>