打印工作,写不。怎么会?

时间:2013-10-31 00:46:26

标签: python file python-2.7 csv

我已经测试了下面的代码,除了第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()

3 个答案:

答案 0 :(得分:6)

print会自动为每个参数调用strwrite没有。

所以,如果你传递一个字符串,它们都会工作,实际上完全相同。但是如果你传递了不同的内容,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更明确。