2012-03-23 9 views
19

Me doy cuenta de que la biblioteca csv en Python siempre genera caracteres DOS al final de la línea. Incluso si uso el modo 'wb', incluso si uso Linux.¿Python csv writer siempre usa caracteres de final de línea de DOS?

import csv 

f = open('output.txt', 'wb'); 
writer = csv.writer(f) 
writer.writerow([2,3,4]); 
f.close() 

El código anterior utiliza siempre '\r\n' como el final del separador de línea. ¿Cómo puedo hacer que use el uso de '\n' solamente?

+3

La especificación CSV MIME exige CRLF como el delimitador de línea: https://tools.ietf.org/html/rfc4180 –

+0

Creo que el lector csv * siempre lo hace y no se puede cambiar, pero usted solo está preguntando acerca del * escritor *, cuyo valor predeterminado puede cambiarse. – smci

Respuesta

42

Puede give your writer ejemplo, un argumento a medida lineterminator en el constructor:

writer = csv.writer(f, lineterminator="\n") 
+0

¿se puede dar lineterminator como una combinación de dos caracteres? – user1479571

+0

@ user1479571 ¿Has probado? –

19

Como Niklas answered, el lineterminator argument le permite elegir los finales de línea. En lugar de codificarlo duro en \n, hágalo independiente de la plataforma utilizando la plataforma line separator: os.linesep.

import csv 
import os 

f = open('output.csv', 'wb') 
writer = csv.writer(f, lineterminator=os.linesep) 
writer.writerow([2,3,4]) 
f.close() 

Para otros que se encuentran este post, no se pierda la 'wb'. No notará un problema si se lo está perdiendo en algunas plataformas como GNU/Linux, pero es importante abrir el archivo en el binary mode en plataformas donde eso importa, como Windows. De lo contrario, el archivo csv puede terminar con terminaciones de línea como \r\r\n. Si usa 'wb' y os.linesep, las terminaciones de línea deberían ser correctas en todas las plataformas.

+0

por lo tanto, incluso si convierte al escritor "* platform independent *", su script sigue dependiendo de la plataforma porque necesita abrirlo en formato binario, ¿pero solo cuando sea necesario? Si intento 'wb' en linux, obtengo un error para' writer.writeheader() ' –

+1

. Lo probé en Ubuntu 16.04 utilizando' writer' y 'DictWriter' con' wb', @CiprianTomoiaga, y funciona bien para yo. Le sugiero que publique una nueva pregunta con un ejemplo de código y el mensaje de error, luego agregue un comentario aquí con un enlace a su pregunta. –

+1

@CiprianTomoiaga Esto no funciona con Python 3. El módulo CSV asume que puede escribir cadenas normales y este ya no es el caso si abre el archivo con ''wb'' (obtendrá un' TypError') . Por lo tanto, debe abrir el archivo de esta manera: 'f = open ('output.csv', 'w', newline = '')' cuando use Python 3. Consulte también la [documentación de Python 3 CSV] (https: //docs.python.org/3.5/library/csv.html#csv.writer). – maxschlepzig

Cuestiones relacionadas