Python: 将 .csv 数据作为字典读入并将数据作为字典打印到 .csv 文件?

Python: Reading in .csv data as dictionary and printing out data as dictionary to .csv file?

我正在编写一个 python 执行以下操作的可执行脚本:

我想从 .csv 文件中收集信息并将其作为字典读入 python。这个 .csv 文件包含几列带标题的信息,我只想提取特定的列(那些带有我想要的特定标题的列),并将这些列打印到另一个 .csv 文件。我正在使用函数 DictReaderDictWriter

我正在将 .csv 文件作为字典读取(标题是键,列值是项目),并将信息作为字典输出到另一个 .csv 文件。

读完之后,我打印出特定标题中的项目(这样我就可以仔细检查我读过的内容)。然后我打开一个新的 .csv 文件并想将数据(我刚刚读入的)写成字典。我可以在键(列标题)中写入,但由于某种原因我的代码不打印任何项目值。在这种情况下,我想要的标题是 'Name' 和 'DOB'。

这是我的代码:

#!/usr/bin/python
import os
import os.path
import re
import sys
import pdb
import csv

csv_file = csv.DictReader(open(sys.argv[1],'rU'),delimiter = ',')
for line in csv_file:
    print line['Name'] + ',' + line['DOB']

fieldnames = ['Name','DOB']
test_file = open('test2.csv','wr')
csvwriter = csv.DictWriter(test_file, delimiter=',', fieldnames=fieldnames)

csvwriter.writerow(dict((fn,fn) for fn in fieldnames))

for row in csv_file:
    csvwriter.writerow(row)
test_file.close()

知道我哪里出错了吗?我想在输出文件中的相应列 headers 下打印项目值。

我在 Mac 机器上使用 python 2.7.11。我也在向终端打印值。

不幸的是,您被自己的测试所欺骗,即打印各个行。通过最初循环遍历 csv_file,您已经用尽了迭代器并到达了最后。进一步的迭代(如代码底部所做的那样)是不可能的,将被忽略。

您的问题本质上是各种其他问题的重复,例如 how to read from a CSV file repeatedly。虽然这里的问题以不同的方式出现:你没有意识到问题是什么,而那些问题确实知道原因,但不知道解决方案。

这些问题的答案告诉您只需重置输入文件的文件指针。不幸的是,在您当前的代码中,输入文件在阅读后立即关闭。

因此,像这样的东西应该可以工作:

infile = open(sys.argv[1], 'rU')
csv_file = csv.DictReader(infile ,delimiter = ',')

<all other code>

infile.seek(0)
for row in csv_file:
    csvwriter.writerow(row)
test_file.close()
infile.close()

顺便说一句,打开文件时只需使用with语句:

with open(sys.argv[1], 'rU') as infile, open('test2.csv', 'wr') as outfile:
    csv_file = csv.DictReader(infile ,delimiter = ',')
    for line in csv_file:
        print line['Name'] + ',' + line['DOB']
    fieldnames = ['Name','DOB']
    csvwriter = csv.DictWriter(outfile, delimiter=',', fieldnames=fieldnames)
    infile.seek(0)
    for row in csv_file:
        csvwriter.writerow(row)

注意:DictWriter 将处理 header 行。不用自己写了。