打印工作,写不.怎么会?

use*_*417 2 python csv file python-2.7

我已经测试了下面的代码,除了第29行之外,一切都按照我的预期进行.final.write(invrow)实际上没有写入文件.当我使用简单的打印输入时,它显示没有问题.我没有错,这里发生了什么?我错过了什么?我做得不好?

import csv


inv = csv.DictReader(open('ireport.txt', 'rU'), dialect='excel-tab', delimiter="\t")
vbr = csv.DictReader(open('vb.txt', 'rU'), dialect='excel-tab', delimiter="\t")
mainr = csv.DictReader(open('main.txt', 'rU'), dialect='excel-tab', delimiter="\t")

final = open('ireport2.tab', 'w')

inva = []
maina = []
vba = []


for row in inv:
    inva.append(row)

for row in mainr:
    maina.append(row)

for row in vbr:
    vba.append(row)

for invrow in inva:
    for mainrow in maina:
        try:
            if invrow['\xef\xbb\xbfPART_CODE'] == mainrow['PART CODE']:
                invrow['MAINQTY'] = mainrow['ON-HAND']
                print invrow # works
                final.write(invrow) #doesn't work. Why?
        except TypeError:
            pass
        except ValueError:
            pass

final.close()
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 6

print自动调用str每个参数.write才不是.

所以,如果你传递一个字符串,它们都会工作,实际上也是完全相同的.但如果你传递不同的东西,write会提出一个TypeError: expected a character buffer object.

在你的情况下,invrow是一个字典,由返回csv.DictReader.这不是一个字符串,所以你会得到TypeError.

您没有错误的原因是您TypeError使用该except TypeError: pass代码明确地捕获并丢弃了代码中的s .


同时,我认为你想要做的是用a csv.DictWriter来写每一行:

writer = csv.DictWriter(final, inv[0].keys())
Run Code Online (Sandbox Code Playgroud)

然后:

writer.writerow(invrow)
Run Code Online (Sandbox Code Playgroud)

作为旁注,您可以极大地简化这一过程.例如,a DictReader是可迭代的; 如果你想列出它,只需要调用list它,不要append一个接一个地循环它.像这样:

inva = list(inv)
maina = list(main)
vba = list(vb)
Run Code Online (Sandbox Code Playgroud)

但实际上,你只需要将"内在" maina改为一个list; 在外面inva,你可以直接在上面循环DictReader.和vba,你永远不会使用.

此外,如果您使用with语句,则不需要显式close.这有另一个好处,如果你的程序在中间退出异常,文件将被刷新并关闭,这样你就可以看到错误发生之前写的是什么.

最后,如果您打算使用try/ except来处理异常并继续使用它们,那么您真的希望打印或记录某些内容,以便您知道它发生了.事实上,我建议离开try在初始开发期间,直到您知道它可以在非破坏文件上运行,并且只在您开始处理损坏的文件时添加它.

把它们放在一起:

with open('main.txt', 'rU') as mainf:
    main = list(csv.DictReader(mainf, dialect='excel-tab', delimiter="\t")
with open('ireport.txt', 'rU') as invf, open('ireport2.tab', 'w') as finalf:
    inv = csv.DictReader(invf, dialect='excel-tab', delimiter="\t")
    final = csv.DictWriter(finalf, dialect='excel-tab', delimiter="\t",
                           fieldnames=inv.fieldnames)
    for invrow in inv:
        for mainrow in main:
            if invrow['\xef\xbb\xbfPART_CODE'] == mainrow['PART CODE']:
                invrow['MAINQTY'] = mainrow['ON-HAND']
                final.writerow(invrow)
Run Code Online (Sandbox Code Playgroud)