2010-06-30 5 views
16

Je suis en train de lire et d'écrire sur le même fichier CSV:lire et écrire sur un même fichier 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') 

Mes fichiers csv sont:

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

Donc, fondamentalement, si ma valeur row[2] est Test I wa nt pour le remplacer par Some new value. Le code ci-dessus me donne des fichiers CSV vides.

Répondre

13

Vous devez utiliser un nom de fichier de sortie différent. Même si vous voulez que le nom soit le même, vous devez utiliser un nom temporaire et enfin renommer le fichier. Lorsque vous ouvrez un fichier en mode 'w' (ou 'wb'), ce fichier est "effacé" - tout le contenu du fichier disparaît. documentation Python pour open() dit:

... pour écrire que « w » (un fichier existant avec le même nom sera effacé), ...

Ainsi, votre fichier est effacé avant que les fonctions csv commencent l'analyser.

3

Si votre fichier csv n'est pas assez grand (pour exploser la mémoire), lisez-le en mémoire et fermez le fichier avant de l'ouvrir en mode écriture.

Ou vous devriez envisager d'écrire dans un nouveau fichier plutôt que le même.

6

Vous ne pouvez pas ouvrir un fichier dans les deux lire et écrire modes à la fois.

Votre code pourrait être modifié comme suit: -

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

Comme Jason souligne, si votre CSV est trop grand pour votre mémoire, vous aurez besoin d'écrire un nom différent, puis le renommer . Ce sera probablement un peu plus lent.

0

Il n'est pas possible d'ouvrir le même fichier dans deux modes différents en python. Vous devez libérer l'un des pointeurs de fichier avec nom_fichier.close() avant d'ouvrir le fichier dans un autre mode!

Questions connexes