How to update rows in a CSV file

前端 未结 2 1475
心在旅途
心在旅途 2020-12-09 04:53

Hello I\'m trying to make a program that updates the values in a csv. The user searches for the ID, and if the ID exists, it gets the new values you want to replace on the r

相关标签:
2条回答
  • 2020-12-09 05:00

    With the csv module you can iterate over the rows and access each one as a dict. As also noted here, the preferred way to update a file is by using temporary file.

    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)
    

    If that's still not working you might try one of these encodings:

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

    Edit: added str, print and encodings

    0 讨论(0)
  • 2020-12-09 05:12

    Simply write to a new file at same time reading over the lines of original, conditionally changing the row based on Stud_ID value. New file is suffixed _new in name.

    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 讨论(0)
提交回复
热议问题