我已经测试了下面的代码,除第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()
print
自动调用str
每个参数。write
才不是。
因此,如果您传递字符串,则它们都将起作用,并且实际上会做完全相同的事情。但是,如果您通过其他操作,write
则会引发TypeError: expected a character buffer object
。
您的情况invrow
是,是由返回的字典csv.DictReader
。那不是字符串,所以您会得到TypeError
。
不会出错的原因是,您正在TypeError
使用该except TypeError: pass
代码在代码中明确捕获并丢弃s 。
同时,我认为您要在此处使用acsv.DictWriter
来写每一行:
writer = csv.DictWriter(final, inv[0].keys())
然后:
writer.writerow(invrow)
附带说明,您可以大大简化此过程。例如,aDictReader
是可迭代的;如果要列出它,只需对其进行调用list
,不要一遍一遍地遍历它append
。像这样:
inva = list(inv)
maina = list(main)
vba = list(vb)
但是实际上,您只需要将“内部”一个更改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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句