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.
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
É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)