csv.writer正在为一个键而不是所有其他键写入值

时间:2018-11-20 23:36:15

标签: python python-3.x csv

我有一个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'

2 个答案:

答案 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的第一列中输出。可能,发布内容未反映实际代码。根据需要在上方进行调整。