CSV模块的编写器不允许我编写二进制ou

2024-03-28 12:52:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在打开文件时使用'w'标记,但它将导致读取不起作用的行双倍隔开。所以我发现改成“wb”是正确的格式。既然我使用了“wb”标志,我就无法让csv.writerow.writerow()工作。我已经把我所有的字符串都编码好了,我不明白为什么会一直得到这个错误。我看到的所有问题都说b'string here'或myString.encode('ascii')解决了我得到的错误,但它并不是为我解决的。以下是我所拥有的:

    dataWriter = csv.writer(open(fileName, 'wb'))
    for i in range(self.ui.table.rowCount()):
        rowData = [self.ui.table.item(i,0).text().encode('utf-8')\
        ,self.ui.table.item(i,1).text().encode('utf-8')\
        ,self.ui.table.item(i,2).text().encode('utf-8')\
        ,self.ui.table.item(i,3).text().encode('utf-8')\
        ,self.ui.table.item(i,4).text().encode('utf-8')]
        dataWriter.writerow(rowData)

我想可以,但它仍然会给我以下错误: TypeError:必须是字节或缓冲区,而不是str 在“dataWriter.writerow(rowData)”行上。

任何帮助都是值得的。 谢谢您。


Tags: 文件csvtext标记selfui错误table
3条回答

您似乎正在运行Python 3.x.有关对csv文件使用二进制模式的建议适用于Python 2.x.3.x不需要codec模块--打开文件时只需使用encoding=whatever3.x需要的是用newline=''打开文件。这适用于读和写,尽管它没有被记录下来(错误报告已经提交)。在解决了您的双圈间距问题后,这将起作用:

import csv
data = [
    ['\xfforick', 123.456],
    ['polonius', 987.564],
    ]
with open('demo.csv', 'w', newline='', encoding='utf8') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

输出文件的内容:

>>> open('demo.csv', 'rb').read()
b'\xc3\xbforick,123.456\r\npolonius,987.564\r\n'
>>>

建议:考虑一下代码的易读性。。。而不是

for i in range(self.ui.table.rowCount()):
    rowData = [self.ui.table.item(i,0).text().encode('utf-8')\
    ,self.ui.table.item(i,1).text().encode('utf-8')\
    ,self.ui.table.item(i,2).text().encode('utf-8')\
    ,self.ui.table.item(i,3).text().encode('utf-8')\
    ,self.ui.table.item(i,4).text().encode('utf-8')]
    dataWriter.writerow(rowData)

试试看

table = self.ui.table
for i in range(table.rowCount()):
    row = [table.item(i, j).text() for j in range(5)]
    writer.writerow(row)

在Python 3中,在二进制模式下使用open创建一个^{},它需要字节,而不是字符串。通过使用encode方法,您可以将字符串更改为字节;但我认为cvs.writer.writerow会在编写之前将这些字节转换回字符串。

与其以二进制模式打开文件,不如尝试找出导致双间距的原因。我有两个问题:

  1. 你在用什么平台?

  2. print repr(self.ui.table.item(i,4).text())的输出是什么?

我的猜测是brandizzi的strip()方法可以工作,但如果不行,我们需要进行一些故障排除。

编辑:好的,John Machin的帖子将其全部清除。在Python 3中解决此问题的正确方法是使用newline=''打开文件,这将禁用自动换行转换。This bug report包含一些有用的信息。

也许您可以让codecs模块为您执行Unicode编码,然后尝试以下方法:

import codecs, csv

with codecs.open(fileName, 'w', encoding = 'utf_8') as f:
    writer = csv.writer(f)
    writer.writerow(['some string', 'some other string'])

相关问题 更多 >