El archivo CSV escrito con Python tiene líneas en blanco entre cada fila

Resuelto Alex Gordon asked hace 14 años • 11 respuestas
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?

Alex Gordon avatar Jul 28 '10 05:07 Alex Gordon
Aceptado

El csv.writermódulo controla directamente los finales de línea y escribe \r\ndirectamente 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\nen Windows, donde el modo de texto predeterminado traducirá cada uno \na \r\n.

#!python3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

Si usa el Pathmó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 StringIOmó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 outfilecon 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 UnicodeReadery UnicodeWriteral 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
Mark Tolonen avatar Jul 27 '2010 22:07 Mark Tolonen

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:
David Maddox avatar Feb 15 '2014 22:02 David Maddox