2010-10-20 24 views
25

Python novato frustrado un poco con el módulo csv. A este ritmo, habría sido más fácil si escribía el archivo del analizador a mí mismo, pero quiero hacer las cosas como Pythonic ....CSVWriter no guarda los datos en un archivo. ¿POR QUÉ?

He escrito un pequeño script en Python que debe guardar mis datos en un archivo CSV .

Aquí hay un fragmento de mi código:

import csv 

wrtr = csv.writer(open('myfile.csv','wb'),delimiter=',', quotechar='"') 

for row in rows: 
    wrtr.writerow([row.field1,row.field2,row.field3]) 

El myfile.csv archivo está creado con éxito, sin embargo, es vacío - pero tiene un bloqueo en ella, como su todavía siendo utilizado por el proceso de Python. Parece que los datos se han escrito en el archivo en la memoria, pero aún no se han eliminado en el disco.

Dado que el proceso de Python mantiene un bloqueo en el archivo, entonces asumo que soy responsable de liberar el bloqueo. Aquí están mis preguntas:

  1. ¿Cómo llego a pitón de descarga a disco
  2. ¿Cómo puedo cerrar el archivo que se abrió en el método csv.writer()?
+29

"" "Hubiera sido más fácil si escribiera el analizador de archivos yo mismo" "- - Lo archivaré bajo" famosas últimas palabras ". –

+0

La intuición principal es que el identificador de archivo aún está abierto después de escribir en el escritor csv. Si elimina la llamada 'abierta' fuera y mantiene un identificador de archivo separado que pasa a csv.writer (csvFile, ...) entonces puede cerrar ese identificador de archivo cuando haya terminado y se vaciará. La respuesta proporcionada por Tim explica algunas buenas maneras de hacer esto. – mindthief

+0

csvwriter falta un método de descarga, esto es un descuido. –

Respuesta

38

Uso

with open('myfile.csv','wb') as myfile: 
    wrtr = csv.writer(myfile, delimiter=',', quotechar='"') 
    for row in rows: 
     wrtr.writerow([row.field1,row.field2,row.field3]) 
     myfile.flush() # whenever you want 

o

myfile = open('myfile.csv','wb') 
wrtr = csv.writer(myfile, delimiter=',', quotechar='"') 
for row in rows: 
    wrtr.writerow([row.field1,row.field2,row.field3]) 
    myfile.flush() # whenever you want, and/or 
myfile.close() # when you're done. 

Lo bueno de la primera aproximación es que el archivo también será automáticamente cerrada correctamente en caso de una excepción.

Si desea que su objeto de archivo sea anónimo, solo se cerrará cuando finalice el programa. La descarga o el enjuague depende del sistema operativo, por lo que podría ser nunca hasta la salida.

+0

No me gustaría 'flush()' en cada paso de iteración cuando no es necesario controlar el archivo contenido durante la iteración 'para la fila en filas'. –

+1

@ Jan-PhilipGehrcke: Es por eso que escribí "siempre que quieras" en el comentario después de ese comando. –

+0

@Tim Entendí que lo decías en serio. Solo quería dejar eso en claro para los demás :). –

5

Los métodos flush() y close() del file object. O use with.

+0

Pero estoy creando un objeto de archivo "anónimo", por lo que no tengo nada para llamar "flush and close against". A menos que esté equivocado, esto significa que tendré que modificar el código ligeramente para cerrar primero un objeto de archivo antes de pasarlo a la función csv.writer(). Entonces puedo llamar flush() y close() en el objeto de archivo como sugirió. Si ese es el caso, entonces la documentación en http://docs.python.org/library/csv.html es de hecho tan inútil/engañosa como creo, y NUNCA volveré a referirme a ella. – skyeagle

+0

Funciona bien aquí. Podría ser algo pervertido que Windows esté haciendo. –

+5

"Pero estoy creando un objeto de archivo 'anónimo'". No lo hagas –

Cuestiones relacionadas