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 los 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 una manera de hacer que no ponga una línea en blanco extra?

En Python 2, abra outfile con el modo 'wb' lugar de 'w' . El csv.writer escribe \r\n en el archivo directamente. Si no abre el archivo en modo binario , escribirá \r\r\n porque en el modo de texto de Windows se traducirá cada \n en \r\n .

En Python 3, la syntax requerida cambió, así que abra outfile con el parámetro adicional newline='' lugar.

Ejemplos:

 # Python 2 with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile: writer = csv.writer(outfile) # Python 3 with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile: writer = csv.writer(outfile) 

Enlaces de documentación

Abrir el archivo en modo binario “wb” no funcionará en Python 3+. O más bien, tendrías que convertir tus datos a binarios antes de escribirlos. Eso es sólo una molestia.

En su lugar, debe 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: 

La respuesta simple es que los archivos csv siempre deben abrirse en modo binario, ya sea para entrada o salida, ya que de lo contrario en Windows hay problemas con el final de la línea. Específicamente en la salida, el módulo csv escribirá \r\n (el terminador de fila CSV estándar) y luego (en modo texto) el tiempo de ejecución reemplazará el \n por \r\n (el terminador de línea estándar de Windows) dando un resultado de \r\r\n .

Jugar con el lineterminator NO es la solución.

Nota: parece que esta no es la solución preferida debido a cómo se agregó la línea adicional en un sistema Windows. Como se indica en el documento de python :

Si csvfile es un objeto de archivo, debe abrirse con la bandera ‘b’ en las plataformas donde eso hace una diferencia.

Windows es una de esas plataformas donde eso hace la diferencia. Aunque cambiar el terminador de línea como se describe a continuación puede haber solucionado el problema, el problema se puede evitar al abrir el archivo en modo binario. Se podría decir que esta solución es más “elegent”. El “violín” con el terminador de línea probablemente habría resultado en un código no portátil entre sistemas en este caso, donde la apertura de un archivo en modo binario en un sistema Unix no produce ningún efecto. es decir. da como resultado un código compatible con varios sistemas.

Desde Python Docs :

En Windows, ‘b’ añadido al modo abre el archivo en modo binario, por lo que también hay modos como ‘rb’, ‘wb’ y ‘r + b’. Python en Windows hace una distinción entre archivos de texto y binarios; los caracteres de fin de línea en los archivos de texto se modifican automáticamente de forma automática cuando se leen o escriben los datos. Esta modificación detrás de escena de los datos del archivo está bien para los archivos de texto ASCII, pero dañará los datos binarios como los de los archivos JPEG o EXE. Tenga mucho cuidado de usar el modo binario cuando lea y escriba tales archivos. En Unix, no se pierde nada con agregar una ‘b’ al modo, de modo que puede usarla de forma independiente para todos los archivos binarios.

Original :

Como parte de los parámetros opcionales para csv.writer, si obtiene líneas en blanco adicionales, es posible que tenga que cambiar el lineterminador (información aquí ). Ejemplo a continuación adaptado de la página de python csv docs. Cámbielo de ‘\ n’ a lo que sea. Como esto es solo una puñalada en la oscuridad por el problema, esto puede o no funcionar, pero es mi mejor suposición.

 >>> import csv >>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n') >>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) >>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) 

Estoy escribiendo esta respuesta wrt to python 3, ya que inicialmente tengo el mismo problema.

Se suponía que obtendría datos de arduino usando PySerial y los escribiría en un archivo .csv. Cada lectura en mi caso terminó con '\r\n' , por lo que la nueva línea siempre estaba separando cada línea.

En mi caso, newline='' opción newline='' no funcionó. Porque mostró algún error como:

 with open('op.csv', 'a',newline=' ') as csv_file: ValueError: illegal newline value: '' 

Así que parece que no aceptan omisión de nueva línea aquí.

Al ver una de las respuestas aquí solo, mencioné el terminador de línea en el objeto escritor, como,

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

y eso me funcionó por saltarme las nuevas líneas adicionales.

Cuando se usa Python 3, se pueden evitar las líneas vacías usando el módulo de codecs . Como se indica en la documentación, los archivos se abren en modo binario, por lo que no es necesario cambiar el kline de nueva línea. Hace poco me encontré con el mismo problema y eso me funcionó:

 with codecs.open( csv_file, mode='w', encoding='utf-8') as out_csv: csv_out_file = csv.DictWriter(out_csv) 

Utilice el método definido a continuación para escribir datos en el archivo CSV.

 open('outputFile.csv', 'a',newline='') 

Solo agregue un parámetro adicional de newline='' dentro del método open :

 def writePhoneSpecsToCSV(): rowData=["field1", "field2"] with open('outputFile.csv', 'a',newline='') as csv_file: writer = csv.writer(csv_file) writer.writerow(rowData) 

¡Esto escribirá filas CSV sin crear filas adicionales!