我已经测试了下面的代码,除了第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()
答案 0 :(得分:6)
print
会自动为每个参数调用str
。 write
没有。
所以,如果你传递一个字符串,它们都会工作,实际上完全相同。但是如果你传递了不同的内容,write
会引发TypeError: expected a character buffer object
。
在您的情况下,invrow
是一个字典,由csv.DictReader
返回。那不是字符串,所以你会得到TypeError
。
您没有收到任何错误的原因是您使用TypeError
代码明确捕获并删除代码中的except TypeError: pass
。
与此同时,我认为你想要在这里做的是使用csv.DictWriter
来写每一行:
writer = csv.DictWriter(final, inv[0].keys())
然后:
writer.writerow(invrow)
作为旁注,您可以极大地简化这一过程。例如,DictReader
是可迭代的;如果你想列出它,只需在它上面调用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)
答案 1 :(得分:0)
我真的不认为这是它,但是由于其他人给出了很好的答案,你可能最需要这个作为最后的绝望修复。
我几周前设法得到了类似的bug,也使用了txt文件。据我所知,你不能将一些unicode / ascii / others符号保存到txt文件中,比如♥☻☺♦♣♠在特定的环境中,我会给你看两个例子:
1:这会让它崩溃:
printablelog = open("examplefile.txt", "a")
printablelog.write("An example ♥☻☺♣ とかちそのラヒイスハレラテ and more text")
printablelog.close()
2:这会以字节为单位保存它,因为它以这种方式编码,你不会得到错误:
printablelogfixed = open("example.txt", "ab")
printablelogfixed.write(bytes("An example ♥☻☺♣ とかちそのラヒイスハレラテ and more text", 'UTF-8'))
printablelogfixed.close()
祝你好运。
答案 2 :(得分:-1)
您只需要在您尝试编写的对象上调用toString()或类似的方法。有些语言会隐式将其转换为可写对象,但您需要使用Python更明确。