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 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 hacer que no ponga una línea en blanco adicional?
Respuestas:
En Python 2, abra
outfile
con modo en'wb'
lugar de'w'
. Lascsv.writer
escrituras\r\n
en el archivo directamente. Si no se abre el archivo en binario modo, escribirá\r\r\n
porque en Windows texto modo se traducirá cada uno\n
en\r\n
.En Python 3, la sintaxis requerida cambió (consulte los enlaces de documentación a continuación), por lo tanto, abra
outfile
con el parámetro adicionalnewline=''
(cadena vacía).Ejemplos:
Enlaces de documentación
fuente
io.open
con elnewlines
argumento. Si todavía está escribiendo en 2.x, parece una mejor opción de todos modos, ya que es compatible con versiones anteriores.io.open
. Hay ununicodecsv
módulo de terceros para Python 2.7 que funciona mejor.newline=''
truco no funciona en python3 con StringIO o TemporaryFile?StringIO
almacena los mismos puntos de código que se codificarían en un archivo yTemporaryFile
admite elnewline
parámetro, por lo que puede abrirse como conopen
. Haga una pregunta con un programa de muestra que no funciona.Abrir el archivo en modo binario "wb" no funcionará en Python 3+. O más bien, tendría que convertir sus datos a binario antes de escribirlos. Eso es solo una molestia.
En cambio, debe mantenerlo en modo texto, pero anular la nueva línea como vacía. Al igual que:
fuente
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 de texto) el tiempo de ejecución reemplazará\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.fuente
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 :
Windows es una de esas plataformas donde eso hace la diferencia. Si bien cambiar el terminador de línea como describí a continuación puede haber solucionado el problema, el problema podría evitarse por completo abriendo el archivo en modo binario. Se podría decir que esta solución es más "elegante". "Jugar" con el terminador de línea probablemente habría resultado en un código no portable entre sistemas en este caso, donde abrir un archivo en modo binario en un sistema Unix no tiene ningún efecto. es decir. da como resultado un código compatible de sistema cruzado.
De Python Docs :
Original :
Como parte de los parámetros opcionales para csv.writer, si obtiene líneas en blanco adicionales, es posible que deba cambiar el terminador de línea (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 del problema, esto puede o no funcionar, pero es mi mejor suposición.
fuente
Estoy escribiendo esta respuesta wrt para python 3, ya que inicialmente tuve el mismo problema.
Se suponía que debía obtener datos de arduino usando
PySerial
y escribirlos en un archivo .csv. Cada lectura en mi caso terminó con'\r\n'
, por lo que la nueva línea siempre separaba cada línea.En mi caso, la
newline=''
opción no funcionó. Porque mostró algún error como:Por lo tanto, parece que no aceptan la 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 funcionó para mí por omitir las nuevas líneas adicionales.
fuente
with open('my_file.csv', 'a',newline='') as csvfile:
Funciona absolutamente bien. El problema con su respuesta es que aquí está escribiendo en' '
lugar de''
El "lineterminator = '\ r'" permite pasar a la siguiente fila, sin una fila vacía entre dos.
fuente
Tomando prestado de esta respuesta , parece que la solución más limpia es usar
io.TextIOWrapper
. Logré resolver este problema por mí mismo de la siguiente manera:La respuesta anterior no es compatible con Python 2. Para tener compatibilidad, supongo que uno simplemente necesitaría envolver toda la lógica de escritura en un
if
bloque:fuente
Utilice el método definido a continuación para escribir datos en el archivo CSV.
Simplemente agregue un
newline=''
parámetro adicional dentro delopen
método:¡Esto escribirá filas CSV sin crear filas adicionales!
fuente
Cuando se usa Python 3, se pueden evitar las líneas vacías usando el módulo de códecs . Como se indica en la documentación, los archivos se abren en modo binario, por lo que no es necesario cambiar el newline kwarg. Me encontré con el mismo problema recientemente y eso funcionó para mí:
fuente