CSV模块的编写者不会让我写二进制文件

Bro*_* S. 4 python csv python-3.x

我试图在打开文件时使用'w'标签,但它会使行间隔两倍,导致读取无效.所以我发现更改为'wb'将是正确的格式.现在我正在使用'wb'标志,我无法使csv.writer.writerow()工作.我已经编码了所有的字符串,并且因为我一直收到这个错误而丢失了.我看到的所有问题都说b'string在这里'或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)
Run Code Online (Sandbox Code Playgroud)

我认为这将工作,但它仍然给我以下错误:"TypeError:必须是字节或缓冲区,而不是str"在行"dataWriter.writerow(rowData)".

任何帮助都会被贬低.谢谢.

Joh*_*hin 11

您似乎正在运行Python 3.x. 有关对csv文件使用二进制模式的建议适用于Python 2.x. 3.x不需要编解码器模块 - 只需encoding=whatever在打开文件时使用.3.x需要的是打开文件 newline=''.这适用于阅读和写作,虽然没有记录用于编写(错误报告已提交).在整理出你的doble-spacing问题后,这将有效:

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)
Run Code Online (Sandbox Code Playgroud)

输出文件的内容:

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

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

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)
Run Code Online (Sandbox Code Playgroud)

尝试

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