我正在写一个执行以下操作的python可执行脚本:
我想从.csv文件中收集信息,并将其作为字典读入python。这个.csv文件包含带有标题的几列信息,我只想提取特定的列(那些具有我想要的特定标题的列),并将这些列打印到另一个.csv文件中。我使用的是DictReader
和DictWriter
函数。
我在.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()
我出错的地方有什么想法吗?我想在输出文件中的相应列标题下打印项值。
我在Mac机器上使用python 2.7.11。我也在给终端打印价值。
答案 0 :(得分:1)
您不幸被自己的测试欺骗,即打印各行。通过最初循环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
将处理标题行。不需要自己写。