import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()
Genera un archivo, test.csv
con un extra \r
en cada fila, así:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
en lugar de lo esperado:
hi,dude\r\nhi2,dude2\r\n
¿Por qué sucede esto o es realmente el comportamiento deseado?
Nota:
- Este comportamiento puede ocurrir con Python 2 o 3.
Respuestas:
Python 3:
newline=''
newline='\n'
Python 2:
En Windows, abra siempre sus archivos en modo binario (
"rb"
o"wb"
), antes de pasarlos acsv.reader
ocsv.writer
.Aunque el archivo es un archivo de texto, CSV es considerado un formato binario por las bibliotecas involucradas, con
\r\n
registros separados. Si ese separador está escrito en modo texto, el tiempo de ejecución de Python reemplaza el\n
con\r\n
, de ahí el\r\r\n
observado en el archivo.Ver esta respuesta anterior .
fuente
open(..., "w", newline="\n", encoding="utf-8")
.newline
También puede ser una cadena en blanco, el mismo resultado."wb"
no funciona en Python 3, las cadenas y la interfaz del búfer son incompatibles.writer = csv.writer(f, lineterminator='\n')
Si bien @ john-machin da una buena respuesta, no siempre es el mejor enfoque. Por ejemplo, no funciona en Python 3 a menos que codifique todas sus entradas al escritor CSV. Además, no soluciona el problema si el script quiere usar sys.stdout como la secuencia.
En su lugar, sugiero configurar el atributo 'lineterminator' al crear el escritor:
Ese ejemplo funcionará en Python 2 y Python 3 y no producirá los caracteres de nueva línea no deseados. Sin embargo, tenga en cuenta que puede producir nuevas líneas indeseables (omitiendo el carácter LF en los sistemas operativos Unix).
Sin embargo, en la mayoría de los casos, creo que el comportamiento es preferible y más natural que tratar todos los CSV como un formato binario. Proporciono esta respuesta como una alternativa para su consideración.
fuente
\r
ya no se escapa! Parece que esto es un errorcsvwriter
, pero tal como está, generar CSV no conforme significa que este no es el camino a seguir.^M
problema para mí, mientras que las 2 sugerencias de la respuesta aceptada no funcionaron.En Python 3 (no he probado esto en Python 2), también puedes simplemente hacer
según la documentación .
Más sobre esto en la nota al pie del documento :
fuente
Puede introducir el parámetro lineterminator = '\ n' en el comando csv writer.
fuente
lineterminator='\n'
); El módulo CSV parecía ser el origen de\r\n
. Ningún conjunto de argumentosopen
tuvo ningún efecto.No estoy seguro de por qué está sucediendo exactamente, pero cambiar el modo de archivo de "w" a "wb" lo arregla. Vea mi respuesta a " cómo eliminar ^ M " para obtener más detalles.
fuente
Debe agregar el atributo newline = "\ n" para abrir una función como esta:
fuente
Tenga en cuenta que si usa DictWriter, tendrá una nueva línea desde la función de abrir y una nueva línea desde la función de escritura. Puede usar newline = '' dentro de la función abierta para eliminar la nueva línea adicional.
fuente