如何更新 CSV 文件中的行

Posted

技术标签:

【中文标题】如何更新 CSV 文件中的行【英文标题】:How to update rows in a CSV file 【发布时间】:2022-01-18 00:53:12 【问题描述】:

您好,我正在尝试制作一个程序来更新 csv 中的值。用户搜索 ID,如果 ID 存在,它会在该 ID 号所在的行上获取要替换的新值。这里row[0:9] 是我的ID 长度。

我的想法是从 0-9 或我的 ID 号所在的位置扫描每一行,当找到它时,我将使用 .replace() 方法替换除它之外的值。我是这样做的:

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

但它不起作用,我需要有关如何解决此问题的想法。

【问题讨论】:

您能提供您的 CSV 数据的片段吗?另外,你有熊猫吗? 不要尝试手动执行此操作。相反,请使用 Python CSV 包csv。它将解码和编码 CSV 文件的行,自动处理所有转义。 @COLDSPEED 先生,我添加了图片。 @TomKarzes 先生,我已经导入了 csv 包。这就是为什么 row[] 起作用的原因。但我想我猜我的实现有误? CSV 包将行作为列表处理,而不是逗号分隔的字符串。您正在尝试使用带有显式逗号的字符串。不要那样做。 【参考方案1】:

使用csv 模块,您可以遍历行并将每一行作为字典访问。正如here 所述,更新文件的首选方法是使用临时文件。

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)

如果这仍然不起作用,您可以尝试以下编码之一:

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

编辑:添加 str、打印和编码

【讨论】:

谢谢先生,您的代码可以正常工作,因为它没有收到失败的消息。但它仍然没有被替换。 我通过使用 r+b 使我的代码工作,但您的代码仍然更好,因为它使用包。但是,和我一样,它没有改变 我相信 rb vs r 是 Python 2 vs 3 的问题。也许您需要将 stud_ID 转换为字符串? str(stud_ID) 你好先生,'stud_ID = str(ID_num.get())' 这实际上是 stud_ID 我要再转换一次吗? 一次就够了。我将在 Python 2 中重试此操作【参考方案2】:

在读取原始行的同时写入新文件,根据 Stud_ID 值有条件地更改行。新文件的名称以 _new 为后缀。

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)

【讨论】:

您好先生,您的代码会删除所有内容。 .csv 和 _new.csv 会在此处自动创建吗? 很奇怪。文件被删除或文件中的内容被删除?这里没有进行文件系统处理。不应从此代码中删除任何文件或内容,并且应创建 _new。我刚测试过。也许其他代码会删除。你在使用 Python 3 吗?

以上是关于如何更新 CSV 文件中的行的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell:如何计算 csv 文件中的行数?

创建数组后,如何正确遍历 CSV 文件中的行数组?

添加行时如何使python停止跳过csv文件中的行[重复]

根据包含数字和不包含数字的行对 CSV 中的行进行排序

如何将每个给定长度的行的 Bigquery 表提取到 Google Storage 中的 csv 文件?

如何区分使用 SymmetricDS 通过 FTP 传输的 CSV 中的更改数据