write work with reading read how files dictreader and python windows csv python-2.x line-endings

work - write csv files in python



Escritor de Python 2 CSV produce un terminador de lĂ­nea incorrecto en Windows (3)

Desafortunadamente, es un poco diferente con el módulo csv para Python 3, pero este código funcionará tanto en Python 2 como en Python 3:

if sys.version_info >= (3,0,0): f = open(filename, ''w'', newline='''') else: f = open(filename, ''wb'')

De acuerdo con su documentación, csv.writer debería usar ''/ r / n'' como lineterminator por defecto.

import csv with open("test.csv", "w") as f: writer = csv.writer(f) rows = [(0,1,2,3,4), (-0,-1,-2,-3,-4), ("a","b","c","d","e"), ("A","B","C","D","E")] print writer.dialect.lineterminator.replace("/r", "//r").replace("/n", "//n") writer.writerows(rows) print writer.dialect.lineterminator.replace("/r", "//r").replace("/n", "//n")

Esto imprime

/r/n /r/n

como se esperaba. Pero, el archivo csv creado utiliza el lineterminator ''/ r / r / n''

0,1,2,3,4 0,-1,-2,-3,-4 a,b,c,d,e A,B,C,D,E

¿Es esto un error o hay algo mal en mi uso de csv.writer?

Versión de Python:

ActivePython 2.6.2.2 (ActiveState Software Inc.) basado en Python 2.6.2 (r262: 71600, 21 de abril de 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] en win32

en Windows Vista


En Python 2.x, siempre abra su archivo en modo binario , como está documentado. csv escribe /r/n como esperaba, pero luego el mecanismo subyacente del archivo de texto de Windows interviene y cambia eso /n a /r/n ... efecto total: /r/r/n

De la documentación de csv.writer :

Si csvfile es un objeto de archivo, debe abrirse con el indicador ''b'' en plataformas donde eso hace la diferencia.

Parece que hay cierta reticencia a pronunciar el nombre del principal culpable :-)


Para cambiar el terminador de línea en Python 2.7 csv writer use

writer = csv.writer(f, delimiter = ''|'', lineterminator=''/n'')

Esta es una forma mucho más simple de cambiar el delimitador predeterminado de / r / n.