Python 3.1.3 Win 7:csv writerow错误;必须是字节或缓冲区,而不是str“;

Python 3.1.3 Win 7:csv writerow错误;必须是字节或缓冲区,而不是str“;,python,python-3.x,Python,Python 3.x,在我的Win xp机器上获得了一个在Python 2.7.1下完美运行的简单脚本。 现在有了一台使用python 3.1.3的Win7机器 代码是: owriter.writerow(dtime[1][1]) dtime[1][1]=['30-Aug-10 16:00:00', '2.5', '15'] 收到此错误消息:TypeError:必须是字节或缓冲区,而不是str 我应该做什么改变 谢谢。更改为str.encode(“ascii”) 关键是,Python2.x在存储字节缓冲区和存储字

在我的Win xp机器上获得了一个在Python 2.7.1下完美运行的简单脚本。 现在有了一台使用python 3.1.3的Win7机器

代码是:

owriter.writerow(dtime[1][1])

dtime[1][1]=['30-Aug-10 16:00:00', '2.5', '15']
收到此错误消息:
TypeError:必须是字节或缓冲区,而不是str

我应该做什么改变

谢谢。

更改为
str.encode(“ascii”)


关键是,Python2.x在存储字节缓冲区和存储字符串时混合使用了
str
type。现在在Python3.x中,我们有了适当的Unicode支持,字节缓冲区现在是独立的类型。您可以使用
str.encode()
bytes.decode()
将每次指定为一个参数在它们之间进行转换。

您可能需要以文本模式打开文件。如果没有,请包含足够的代码以使其可运行并演示问题。

在Python2.X中,使用“b”打开csvfile是因为csv模块自己进行行终止处理

在Python3.X中,csv模块仍然执行自己的行终止处理,但仍然需要知道Unicode字符串的编码。打开csv文件进行写入的正确方法是:

outputfile=open("out.csv",'w',encoding='utf8',newline='')

编码
可以是您需要的任何内容,但是
换行=''
禁止文本模式的换行处理。在Windows上,如果不这样做,将写入\r\n文件行结尾,而不是正确的\r\n。这仅在3.X文档中提到,但也需要它。

当您从Python 2升级到Python 3时,是否运行了脚本?owriter=csv.writer(outputfile),不,我没有运行2to3。什么是
outputfile
?张贴你的实际代码。这一点都不容易理解。只是运行了2to3,没有变化。非常好的评论;Windows的文本/二进制文件模式很常见。谢谢。代码是:outputfile=open(“out.csv”,“wb”)owriter=csv.writer(outputfile)owriter.writerow(dtime[1][1])outputfile.close()@steve,所以去掉
b
标志。CSV文件不是二进制文件,它们应该以文本模式打开。@steve:那你为什么要用
'wb'
打开文件?@steve:事实上,你确实是以二进制模式打开的,就像怀疑的那样。将其更改为文本模式可以解决此问题。@steve它是字符串对象的一种方法。您必须将它们用作
“foo bar”。encode(“utf-8”)
@steve请注意,在您的情况下,您不应该以二进制模式打开CSV文件,[Lennart的答案][]是正确的解决方案。+1碰巧,在我提出关于3.X CSV.writer文档的错误报告后,我应该尝试回答文档修补程序的请求-----谢谢提醒:-)