python - ejemplos - django
El archivo CSV escrito con Python tiene lĂneas en blanco entre cada fila (6)
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 alguna manera de evitar que se ponga una línea en blanco extra?
Abrir el archivo en modo binario "wb" no funcionará en Python 3+. O más bien, tendría que convertir sus 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:
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 kwarg 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)
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 sintaxis 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
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 solo una de las respuestas aquí, 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.
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 de 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 haga una diferencia.
Windows es una de esas plataformas donde eso marca 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 "Fiddling" con el terminador de línea probablemente habría resultado en un código no portátil entre los sistemas en este caso, donde la apertura de un archivo en modo binario en un sistema Unix no produce ningún efecto. es decir. se traduce en un código compatible del sistema cruzado.
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 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 determinador de líneas (información here ). 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''])