2010-06-30 21 views
16

Estoy tratando de leer y escribir en el mismo archivo CSV:de lectura y escritura en el mismo archivo csv

file1 = open(file.csv, 'rb') 
file2 = open(file.csv, 'wb') 
reader = csv.reader(file1) 
writer = csv.writer(file2) 
for row in reader: 
    if row[2] == 'Test': 
     writer.writerow(row[0], row[1], 'Somevalue') 

Mis archivos CSV son:

  • val1,2323,Notest
  • val2, 2323,Test

Así que, básicamente, si mi valor row[2] es Test me wa nt para reemplazarlo con Some new value. El código anterior me da archivos CSV vacíos.

Respuesta

13

Debe utilizar un nombre de archivo de salida diferente. Incluso si desea que el nombre sea el mismo, debe usar algún nombre temporal y finalmente cambiar el nombre del archivo.

Al abrir el archivo en el modo 'w' (o 'wb'), este archivo se "borra": el contenido de todo el archivo desaparece. documentación de Python para open() dice:

... 'w' por sólo escritura (un archivo existente con el mismo nombre será borrado), ...

Así que su archivo se borra antes de que comiencen las funciones csv analizándolo

3

Si su archivo csv no es lo suficientemente grande (para hacer estallar la memoria), léalo todo en la memoria y cierre el archivo antes de abrirlo en modo de escritura.

O debería considerar escribir en un archivo nuevo en lugar de en el mismo.

6

No puede abrir un archivo en lea y escriba modos a la vez.

Su código podría modificarse de la siguiente manera: -

# Do the reading 
file1 = open(file.csv, 'rb') 
reader = csv.reader(file1) 
new_rows_list = [] 
for row in reader: 
    if row[2] == 'Test': 
     new_row = [row[0], row[1], 'Somevalue'] 
     new_rows_list.append(new_row) 
file1.close() # <---IMPORTANT 

# Do the writing 
file2 = open(file.csv, 'wb') 
writer = csv.writer(file2) 
writer.writerows(new_rows_list) 
file2.close() 

Como señala Jason, si su CSV es demasiado grande para la memoria, entonces tendrá que escribir en un nombre de archivo diferente y luego cambiarle el nombre . Esto probablemente será un poco más lento.

0

No es posible abrir el mismo archivo en dos modos diferentes en python. ¡Tiene que liberar uno de los punteros de archivo con file_name.close() antes de abrir el archivo en otro modo!

Cuestiones relacionadas