gpt4 book ai didi

python - 打印作品,写不。怎么会?

转载 作者:行者123 更新时间:2023-11-28 21:57:33 27 4
gpt4 key购买 nike

我已经测试了下面的代码,除了第 29 行之外,一切都按照我的预期进行。final.write(invrow) 实际上并没有写入文件。当我使用简单的 print 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 自动调用每个参数的 strwrite 不会。

因此,如果您传递一个字符串,它们都会起作用,而且实际上做的是完全相同的事情。但是如果你传递一些不同的东西,write 会引发一个TypeError: expected a character buffer object

在您的例子中,invrow 是一个字典,由 csv.DictReader 返回。这不是字符串,因此您将得到 TypeError

你没有得到任何错误的原因是你在你的代码中明确地捕获并丢弃了 TypeErrors,以及 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)

但实际上,您只需要将“内部”main 更改为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)

关于python - 打印作品,写不。怎么会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19696512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com