2010-11-22 15 views
9

Usando Python para anexar archivos CSV, obtengo datos cada dos filas. ¿Cómo puedo solucionarlo?¿Cómo anexar a un archivo CSV?

import csv 

LL = [(1,2),(3,4)] 

Fn = ("C:\Test.csv") 
w = csv.writer(open(Fn,'a'), dialect='excel') 
w.writerows(LL) 

C:\test.csv cuando se abre el siguiente aspecto:

1,2 

3,4 

1,2 

3,4 
+0

¿Cuál es la pregunta/problema? No está claro para mí ... – poke

+0

"Recibo datos cada dos filas. ¿Cómo lo soluciono?" ¿Qué significa exactamente esto? ¿Se puede pegar la salida de muestra frente a la salida de muestra deseada? – Chris

+2

@poke, @Chris: El OP está insertando una fila vacía inesperada después de cada fila de datos esperados. –

Respuesta

34

Anexión es irrelevante para el problema; Observe que las primeras dos filas (las del archivo original) también tienen doble espacio.

El problema real es que ha abierto su archivo en el modo de texto.

CSV es un formato binario, lo creas o no. El módulo csv está escribiendo el "lineterminator" ("rowseparator") engañosamente nombrado como \r\n como se esperaba, pero luego el tiempo de ejecución de Windows C entra en acción y reemplaza el \n con \r\n para que tenga \r\r\n entre las filas. El archivo csv con Excel confunde

Siempre abra sus archivos CSV en modo binario ('rb', 'wb', 'ab'), ya sea que esté operando en Windows o no. De esta forma, obtendrá el esperado rowseparator (CR LF) incluso en * x recuadros, tu código será portable, y cualquier avance de línea incrustado en tus datos no se cambiará en otra cosa (por escrito) ni provocará dramas (en la entrada, siempre y cuando estén citados correctamente).

Oth er problemas:

(1) No coloque sus datos en su directorio raíz (C:\). Windows heredó un sistema de archivos jerárquico de MS-DOS en la década de 1980. Úselo.

(2) Si debe incrustar nombres de archivos con cable en el código, use cadenas sin formato r"c:\test.csv" ... si tuviera "c:\test.csv", la '\ t' se interpretaría como un carácter TAB; problemas similares con \r y \n

(3) Los ejemplos en el manual de Python se alinean más hacia la brevedad que el código robusto.

No haga esto:

w = csv.writer(open('foo.csv', 'wb')) 

Haga lo siguiente:

f = open('foo.csv', 'wb') 
w = csv.writer(f) 

Luego, cuando haya terminado, usted tiene f disponibles para que pueda hacer f.close() para asegurar que sus contenidos son archivos enrojecido en el disco. Aún mejor: lee la nueva declaración with.

+0

Darn. Me di cuenta de esto y estaba a la mitad de una respuesta que decía lo mismo. +1. –

+0

+1; para una respuesta completa y una explicación completa. – bernie

+0

Curiosamente, aunque la mayoría de los ejemplos en los documentos 'csv' para Python 2 usa el modo binario, el [' DictReader'] (https://docs.python.org/2/library/csv.html#csv.DictReader) los ejemplos no lo hacen, ni lo hacen [ninguno de los ejemplos de Python 3] (https://docs.python.org/3/library/csv.html). ¿Hay alguna buena razón para esto? Si no, ¿tal vez le gustaría intentar cambiar los documentos? –

2

He encontrado un problema similar al agregar un archivo csv ya creado, mientras se ejecuta en Windows.

Como en este caso escribir y anexar en modo "binario" evita agregar líneas adicionales a cada fila escrita o anexada mediante el uso del script de python. Por lo tanto;

w = csv.writer(open(Fn,'ab'),dialect='excel') 
+0

En windows, tienes que hacer mucha codificación defensiva con python ... – Merlin