DictReader 的类型错误

big*_*ree 2 python csv

我正在使用 DictReader 和 DictWriter 处理 csv 文件。

我尝试根据此处找到的以下代码进行工作:

import csv

fieldnames = ['Node', 'ID', 'Test Description', 'file-name',
              'module', 'view', 'path1','path2'] # defines order in output file

with open('testdata.txt', 'rb') as csvinput:
    with open('testdata2.txt', 'wb') as csvoutput:
        csvwriter = csv.DictWriter(csvoutput, fieldnames, delimiter=',')
        csvwriter.writeheader()
        nodecount = 0
        for row in csv.DictReader(csvinput):
            nodecount +=1
            row['Node'] = 'node %s' % nodecount  # add 'Node' entry to row data
            csvwriter.writerow(row)
Run Code Online (Sandbox Code Playgroud)

我使用 python 3.2 并收到以下错误:

  File "/usr/lib/python3.2/csv.py", line 153, in writerow
  return self.writer.writerow(self._dict_to_list(rowdict))
TypeError: 'str' does not support the buffer interface
Run Code Online (Sandbox Code Playgroud)

我读到这个错误可能是由于“如果您使用 Python3x,那么字符串与 Python 2.x 的类型不同,您必须将其转换为字节(对其进行编码)”。

但在这里,文件已经使用“b”参数打开(因此作为二进制文件),对吧?

DSM*_*DSM 5

您正在使用 Python 3 中的模块的 Python 2 示例。csv正如您所猜测的,作为 str/bytes 开关的一部分,打开文件所需的模式csv发生了一些变化。(我承认这种差异可能令人头疼,但在 Python 3 中比在 Python 2 中更有意义,所以这是值得的。)

正如文档所解释的,打开 csv 文件进行读/写所需的新习惯用法是

with open('testdata.txt', newline='') as csvinput:
    with open('testdata2.txt', 'w', newline='') as csvoutput:
Run Code Online (Sandbox Code Playgroud)