我有一个csv文件,其中包含成对的密钥对。
让我们调用密钥'key'
和不同的值'a'
,'b'
,'c'
等。
我正在尝试使用csv.writer
,以便仅在值为'b'
时才将行写到文件上。
到目前为止,我有以下代码:
csvfileR = []
with open('csvfileR.csv', 'r') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
csvfileR.append(row)
w = open('csvfileW.csv','w')
fieldnames = ['key']
writer = csv.writer(w)
writer.writerow(fieldnames)
for i in range(len(csvfileR)):
if csvfileR[i]['key'] == 'b':
print (csvfileR[i]['key'])
fields = [csvfileR[i]['key']]
writer.writerow(fields)
问题在于,writer
在过滤值'a'
(if csvfileR[i]['key'] == 'a'
)时正确写入,而在过滤其他任何值(if csvfileR[i]['key'] == 'b'
时给出空白的csv文件(或'c'
或'd'
等))。
print
方法适用于所有值,因此正确附加了Dict
。
具体地说,csvfileR
包含我的资产交易数据。我希望csv.writer
用交易数据为一系列不同资产中的一个资产创建“ csvfileW
”。
csvfileR
的一行如下所示:
OrderedDict([('Date', '2016.09.12'), ('Name of Asset Traded', 'Facebook Stock'), ('Price purchased', '$100'), ('Price sold, '$150')
问题在于,csv.writer
将在我过滤出我的第一笔资产“ Facebook股票”时写,但在我过滤出其他资产时将不会写。
所以
if csvfileR[i]['Name of Asset Traded'] == 'Facebook Stock'
将正确创建CSV文件,但是
if csvfileR[i]['Name of Asset Traded'] == 'Apple Stock'
或
if csvfileR[i]['Name of Asset Traded'] == 'FedEx Stock'
将创建一个空白CSV文件。
但是
print (csvfileR[i]['Name of Asset Traded'])
每次运行时都会打印出'Apple'
或''FedEx'
。
答案 0 :(得分:0)
只是想通了。非常愚蠢的错误。在代码末尾不包含w.close()。代码现在可以正常工作了。谢谢您的帮助。
答案 1 :(得分:0)
如上所述,请考虑使用一个with
来处理两个文件的读写,甚至可以避免使用 csvfileR 列表。
with open('csvfileR.csv', 'r') as csvfile, open('csvfileW.csv', 'w') as outfile:
fieldnames = ['key']
writer = csv.writer(outfile)
writer.writerow(fieldnames)
reader = csv.DictReader(csvfile)
for row in reader:
if row['key'] == 'b':
print (row['key'])
fields = [row['key']]
writer.writerow(fields)
但是,上面的代码似乎很奇怪,因为只有 b 会在输出csv的第一列中输出。可能,发布内容未反映实际代码。根据需要在上方进行调整。