以“ rb”模式打开一个csv文件并对其进行迭代

时间:2019-01-03 13:13:57

标签: python python-3.x csv

对于Inline CSV File Editing with Python帖子,我看到了一个较旧的答案,该帖子有关如何修改csv文件并保存它。它使用tempfile模块。我在Python 3.6中使用了相同的代码,但由于在二进制模式下读取文件而无法对其进行迭代,因此出现错误。

下面的代码创建一个简单的CSV文件

import csv

with open('proglanguages.csv', mode='w', newline='') as csv_file:
    fieldnames = ['lang', 'value']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writerow({'lang': 'Java', 'value': '90'})
    writer.writerow({'lang': 'c', 'value': '80'})
    writer.writerow({'lang': 'Perl', 'value': '78'})
    writer.writerow({'lang': 'C++', 'value': '92'})
    writer.writerow({'lang': 'Python', 'value': '0'})
    writer.writerow({'lang': 'Fortran', 'value': '70'})

以下代码修改了先前生成的CSV文件

from tempfile import NamedTemporaryFile
import shutil
import csv

filename = 'proglanguages.csv'
tempfile = NamedTemporaryFile(delete=False)


with open(filename, mode='rb') as csvFile, tempfile:
    reader = csv.reader(csvFile, delimiter=',', quotechar='"')
    writer = csv.writer(tempfile, delimiter=',', quotechar='"')

    for row in reader:
        if row[0] == 'Python':
            row[1] = '100'
            writer.writerow(row)
        else:
            writer.writerow(row)

shutil.move(tempfile.name, filename)

以哪种方式,我可以使用for循环进行迭代,修改项目并写入临时文件

1 个答案:

答案 0 :(得分:2)

您在这里并不幸运。 Martijn Pieters的回答总是高质量的。当您使用Python 3时,这个代码曾经是针对Python 2的。并且csv语义已经发生了变化……您不应再在Python 3中使用二进制模式,而是要对初始的csv文件执行以下操作:

...
tempfile = NamedTemporaryFile(delete=False, newline='', mode='w')

with open(filename, mode='r', newline='') as csvFile, tempfile:
    reader = csv.reader(csvFile)
    writer = csv.writer(tempfile)
    ...