Python 使用dictwriter覆盖同一csv文件中的行

Python 使用dictwriter覆盖同一csv文件中的行,python,csv,writer,Python,Csv,Writer,我有名字 first_name,last_name Baked,Beans Lovely,Spam John,Bang Harry,Potter 我想在同一个文件中将“John Ban”重命名为“jason statham”。 我尝试使用file.seek(),但失败 import csv with open('/home/tiwari/Desktop/names.csv', 'rw+') as csvfile: fieldnames = ['first_name', 'last_na

我有名字

first_name,last_name
Baked,Beans
Lovely,Spam
John,Bang
Harry,Potter
我想在同一个文件中将“John Ban”重命名为“jason statham”。 我尝试使用file.seek(),但失败

import csv
with open('/home/tiwari/Desktop/names.csv', 'rw+') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    reader = csv.DictReader(csvfile)
    for line, row in enumerate(reader):
        rs = sys.getsizeof(row)
        if row['first_name'] == 'John':
            csvfile.seek(-rs)
            writer.writerow({'first_name': 'Jason', 'last_name': 'statham'})

除非替换字符串的长度与原始字符串的长度完全相同,否则您的方法将不起作用

我建议读所有行,替换它们,然后写回

import csv

with open('/home/tiwari/Desktop/names.csv', 'r+') as csvfile:
    reader = csv.DictReader(csvfile)

    rows = []
    for row in reader:
        if row['first_name'] == 'John':
            row['first_name'] = 'Jason'
            row['last_name'] = 'Statham'
        rows.append(row)

    csvfile.seek(0)  # back to begining of the file.
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(rows)
    csvfile.truncate()  # In case of updated content is shorter.

我同意你的建议,但我必须对数百万条记录运行它,在这种情况下,将所有记录存储到列表可能是内存问题和额外的开销。如果我们有一些使用相同读写器指针的解决方案会更好。@sujittiwari,那么你最好写入另一个文件(
names2.csv
),写入完成后,将其重命名为
names.csv
。@sujittiwari,不可能使用
seek(-n,1)
,特别是如果替换字符串和原始字符串长度不同,如我在回答中所述。您好@falsetru,我已经这样做了,但我认为可以节省一些写入周期。谢谢你的考虑