2010-06-30 31 views
16

Sto cercando di leggere e scrivere sullo stesso file CSV:lettura e scrittura sullo stesso file 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') 

miei file CSV sono:

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

Quindi in pratica se il mio valore row[2] è Test I wa nt per sostituirlo con Some new value. Il codice precedente mi dà file CSV vuoti.

risposta

13

È necessario utilizzare un nome file di output diverso. Anche se vuoi che il nome sia lo stesso, dovresti usare un nome temporaneo e infine rinominare il file.

Quando si apre il file in modalità 'w' (o 'wb') questo file è "cancellato" - l'intero contenuto del file scompare. documentazione Python per open() dice:

... 'w' per la sola scrittura (un file esistente con lo stesso nome verrà cancellato), ...

Quindi il file viene cancellato prima di iniziare le funzioni CSV analizzandolo

3

Se il file csv non è abbastanza grande (per esplodere la memoria), leggere tutto in memoria e chiudere il file prima di aprirlo in modalità di scrittura.

Oppure dovresti prendere in considerazione la scrittura in un nuovo file anziché lo stesso.

6

Non è possibile aprire un file in entrambi letto e scrivere le modalità in una sola volta.

Il codice potrebbe essere modificato come segue: -

# 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() 

Come Jason fa notare, se il vostro CSV è troppo grande per la memoria, allora avrete bisogno di scrivere un nome diverso e quindi rinominarlo . Questo sarà probabilmente un po 'più lento.

0

Non è possibile aprire lo stesso file in due diverse modalità in python. Prima di aprire il file in un'altra modalità, è necessario rilasciare uno dei puntatori di file con nome_file.close().

Problemi correlati