leer y escribir en el mismo archivo csv

Estoy tratando de leer y escribir 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

Básicamente, si el valor de mi row[2] es Test , quiero reemplazarlo con un Some new value . El código anterior me da archivos CSV vacíos.

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.

Cuando abre el archivo en el modo ‘w’ (o ‘wb’), este archivo se “borra”; todo el contenido del archivo desaparece. La documentación de Python para open() dice:

… ‘w’ solo para escritura (se borrará un archivo existente con el mismo nombre), …

Así que su archivo se borra antes de que las funciones csv comiencen a analizarlo.

No puede abrir un archivo en modo de lectura y escritura a la vez.

Su código podría ser modificado 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 Jason señala, si su CSV es demasiado grande para su memoria, deberá escribir en un nombre de archivo diferente y luego cambiarle el nombre. Esto probablemente será un poco más lento.

Si su archivo csv no es lo suficientemente grande (para explotar 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.

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

Este código podría funcionar:

 import csv with open(file,"r+") as file: break 

Nota: Descubrí que la “escritura” se vio afectada ya que el valor anterior no se eliminó antes de agregar el siguiente valor, por lo que se vería así (escribiendo = ‘Hola’):

>>> [‘Hola’]

>>> [‘HelloHello’]

Yo sugeriría esto:

 def writing(file,'what to write'): with open(file, "w") as wfile: break def reading(file): with open(file, "r") as rfile: break