TypeError:'str'不支持缓冲区接口问题

时间:2015-03-20 15:42:33

标签: python string python-3.x byte

导入csv     导入运算符

writenames = "col1, Name, col2, col3, col4".split(",")
reader = csv.DictReader(open("Test.csv", "rb"))
writer = csv.DictWriter(open("Test1.csv", "wb"), \
    fieldnames=writenames)
reorderfunct = lambda r: dict([(col, r[col]) for col in writenames])
writer.writeheader()
for row in reader:
    writer.writerow(reorderfunct(row)

输出:

Traceback (most recent call last):
  File "C:\Users\evan.keeler\My Documents\LiClipse Workspace\Test
Test\ColumnSwitch.py", line 10, in <module>
     writer.writeheader()
  File "C:\Python34\lib\csv.py", line 142, in writeheader
    self.writerow(header)
  File "C:\Python34\lib\csv.py", line 153, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
TypeError: 'str' does not support the buffer interface

我不确定这里的问题是什么?我知道你必须将字符串转换为字节,但我不知道如何使用这个特定的例子。

2 个答案:

答案 0 :(得分:1)

在python3中,csv文件需要以文本模式打开,而不是二进制文件,需要使用newline =''打开它们。

reader = csv.DictReader(open("Test.csv", "r", newline=''))
writer = csv.DictWriter(open("Test1.csv", "w", newline=''), fieldnames=writenames)

这是csv.reader and csv.writer docs:

中唯一提到的
  

如果csvfile是文件对象,则应使用newline =''

打开它

虽然DictReader和DictWriter也需要它。

只在python2中打开以二进制模式打开csv文件。

答案 1 :(得分:0)

您应该以文本模式打开文件,而不是二进制模式。

reader = csv.DictReader(open("Test.csv", "r"))
writer = csv.DictWriter(open("Test1.csv", "w"), fieldnames=writenames)

请参阅DictReader documentation