【问题标题】:Overwriting row in same csv file using dictwriter使用 dictwriter 覆盖同一 csv 文件中的行
【发布时间】:2016-03-02 07:53:31
【问题描述】:

我有 names.csv

first_name,last_name
Baked,Beans
Lovely,Spam
John,Bang
Harry,Potter

我想在同一个文件中用“jason statham”重命名“John Ban”。 我尝试使用 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'})

【问题讨论】:

    标签: python csv writer


    【解决方案1】:

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

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

    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,我已经这样做了,但想节省一些写入周期。感谢您的考虑
    猜你喜欢
    • 2021-06-30
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多