El archivo CSV escrito con Python tiene líneas en blanco entre cada fila
import csv
with open('thefile.csv', 'rb') as f:
data = list(csv.reader(f))
import collections
counter = collections.defaultdict(int)
for row in data:
counter[row[10]] += 1
with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
writer = csv.writer(outfile)
for row in data:
if counter[row[10]] >= 504:
writer.writerow(row)
Este código lee thefile.csv
, realiza cambios y escribe resultados en thefile_subset1
.
Sin embargo, cuando abro el csv resultante en Microsoft Excel, ¡hay una línea en blanco adicional después de cada registro!
¿Hay alguna manera de evitar que quede una línea en blanco adicional?
El csv.writer
módulo controla directamente los finales de línea y escribe \r\n
directamente en el archivo. En Python 3, el archivo debe abrirse en modo de texto sin traducir con los parámetros 'w', newline=''
(cadena vacía) o se escribirá \r\r\n
en Windows, donde el modo de texto predeterminado traducirá cada uno \n
a \r\n
.
#!python3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
Si usa el Path
módulo:
from pathlib import Path
import csv
with Path('/pythonwork/thefile_subset11.csv').open('w', newline='') as outfile:
writer = csv.writer(outfile)
Si utiliza el StringIO
módulo para generar un resultado en memoria, la cadena de resultado contendrá el terminador de línea traducido:
from io import StringIO
import csv
s = StringIO()
writer = csv.writer(s)
writer.writerow([1,2,3])
print(repr(s.getvalue())) # '1,2,3\r\n' (Windows result)
Si escribe esa cadena en un archivo más adelante, recuerde usar newline=''
:
# built-in open()
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as f:
f.write(s.getvalue())
# Path's open()
with Path('/pythonwork/thefile_subset11.csv').open('w', newline='') as f:
f.write(s.getvalue())
# Path's write_text() added the newline parameter to Python 3.10.
Path('/pythonwork/thefile_subset11.csv').write_text(s.getvalue(), newline='')
En Python 2 , use el modo binario para abrir outfile
con el modo 'wb'
en lugar de 'w'
evitar la traducción de nueva línea de Windows. Python 2 también tiene problemas con Unicode y requiere otras soluciones para escribir texto que no sea ASCII. Consulte el enlace de Python 2 a continuación y los ejemplos UnicodeReader
y UnicodeWriter
al final de la página si tiene que lidiar con la escritura de cadenas Unicode en archivos CSV en Python 2, o consulte el módulo unicodecsv de terceros:
#!python2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
writer = csv.writer(outfile)
Enlaces de documentación
- https://docs.python.org/3/library/csv.html#csv.writer
- https://docs.python.org/2/library/csv.html#csv.writer
Abrir el archivo en modo binario "wb" no funcionará en Python 3+. O mejor dicho, tendrías que convertir tus datos a binario antes de escribirlos. Eso es sólo una molestia.
En su lugar, debes mantenerlo en modo texto, pero anular la nueva línea como vacía. Al igual que:
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile: