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)
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)