2

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

3 回答 3

6

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

所以,如果你传递一个字符串,它们都可以工作,而且实际上做同样的事情。但是如果你传递不同的东西,write会引发一个TypeError: expected a character buffer object.

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

你没有得到错误的原因是你在你的代码中明确地捕获和丢弃TypeErrors ,使用该except TypeError: pass代码。


同时,我认为您在这里想要做的是使用 acsv.DictWriter来编写每一行:

writer = csv.DictWriter(final, inv[0].keys())

然后:

writer.writerow(invrow)

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

inva = list(inv)
maina = list(main)
vba = list(vb)

但实际上,您只需要将“内部”的 , 更改mainalist; 外面的 , 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)
于 2013-10-31T00:50:00.780 回答
0

我真的不认为是这样,但由于其他人给出了很好的答案,你可能还需要这个作为最后的绝望修复。

几周前我设法得到了一个类似的错误,也使用 txt 文件。据我所知,您无法将某些 unicode/ascii/others 符号保存到 txt 文件中,例如 ♥☻☺♦♣♠ 在特定情况下,我将向您展示 2 个示例:

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

祝你好运。

于 2013-10-31T01:51:29.877 回答
-1

您只需要在您尝试编写的对象上调用 toString() 或类似方法。某些语言会将其隐式转换为可写对象,但您需要更明确地使用 Python。

于 2013-10-31T01:04:51.150 回答