web-dev-qa-db-fra.com

Comment mettre à jour des lignes dans un fichier CSV

Bonjour, j'essaie de créer un programme qui mette à jour les valeurs dans un csv. L'utilisateur recherche l'ID et, s'il existe, il récupère les nouvelles valeurs à remplacer sur la ligne où se trouve ce numéro. Ici, row[0:9] est la longueur de mon identifiant. 

Mon idée était d’analyser chaque ligne de 0 à 9 ou l’emplacement de mon numéro d’identification, puis de la remplacer par la méthode .replace(). Voici comment je l'ai fait:

    def update_thing():
        replace = stud_ID +','+ stud_name +','+ stud_course +','+ stud_year
        empty = []
        with open(fileName, 'r+') as upFile:
            for row in f:
                if row[0:9] == stud_ID:
                    row=row.replace(row,replace)
                    msg = Label(upd_win, text="Updated Successful", font="fixedsys 12 bold").place(x=3,y=120)
                if not row[0:9] == getID:
                    empty.append(row)

        upFile.close()
        upFile = open(fileName, 'w')
        upFile.writelines(empty)
        upFile.close()  

Mais cela ne fonctionne pas, j'ai besoin d'idées sur la façon de traverser cela.

 Screenshot

4
Jed Hart

Avec le module csv, vous pouvez parcourir les lignes et accéder à chacune d’elles sous forme de dict. Comme indiqué également ici , la méthode préférée pour mettre à jour un fichier consiste à utiliser un fichier temporaire.

from tempfile import NamedTemporaryFile
import shutil
import csv

filename = 'my.csv'
tempfile = NamedTemporaryFile(mode='w', delete=False)

fields = ['ID', 'Name', 'Course', 'Year']

with open(filename, 'r') as csvfile, tempfile:
    reader = csv.DictReader(csvfile, fieldnames=fields)
    writer = csv.DictWriter(tempfile, fieldnames=fields)
    for row in reader:
        if row['ID'] == str(stud_ID):
            print('updating row', row['ID'])
            row['Name'], row['Course'], row['Year'] = stud_name, stud_course, stud_year
        row = {'ID': row['ID'], 'Name': row['Name'], 'Course': row['Course'], 'Year': row['Year']}
        writer.writerow(row)

shutil.move(tempfile.name, filename)

Si cela ne fonctionne toujours pas, essayez l'un de ces encodages:

with open(filename, 'r', encoding='utf8') as csvfile, tempfile:
with open(filename, 'r', encoding='ascii') as csvfile, tempfile:

Edit: str ajouté, impression et encodages

4
brennan

Écrivez simplement dans un nouveau fichier en même temps en lisant les lignes de l’original, en modifiant conditionnellement la ligne en fonction de Stud_ID value Le nouveau fichier est suffixé _new en nom.

line_replace = stud_ID +','+ stud_name +','+ stud_course +','+ stud_year

with open(fileName, 'r') as readFile, open(fileName.replace('.csv', '_new.csv'), 'w') as writeFile: 
   for row in readFile:
      if row[0:9] == stud_ID:
         writeFile.write(line_replace)
         msg = Label(upd_win, text="Updated Successful", font="fixedsys 12 bold").place(x=3,y=120)
      else: 
         writeFile.write(row)
0
Parfait