TypeError: ‘str’ does not support the buffer interface

下面代码在Python 2.7.6运行正常,在Python 3.4.3运行出错,OS为Win8.1,报错信息为:’str’ does not support the buffer interface. Stack Overflow相关问题

with open("test.txt") as fp:
    line = fp.readline()
with open("test.out", 'wb') as fp:
    fp.write(line)

解决方法

原因是Python3x的string类型与Python2x的类型不相同,在Python3x中需要将str编码,如:

with open("test.txt") as fp:
    line = fp.readline()
with open("test.out", 'wb') as fp:
    fp.write(bytes(line, 'utf-8'))

如果你不想用b(binary)模式写入,那么用t(text, 此为写入的默认模式)模式写入可以避免这个错误,如:

with open("test.txt") as fp:
    line = fp.readline()
with open("test.out", 'wt') as fp:
# with open("test.out", 'w') as fp:
    fp.write(line)

关于binary mode和text mode

那么进一步,我们为什么要用binary mode,而不用text mode呢?Stack Overflow相关问题

在POSIX-related系统(如Liunx,Unix等)中,text文件和binary文件是不区分的,所以wbwt是没有区别的。

在Windows系统中,由于Python在windows中会区分text文件和binary文件,当数据被读入或者写入时,它会在每行字符串尾部自动进行轻微地修改,具体来说,以text模式打开一个文件时,fd.write("foo\n")实际上在磁盘上写入了foo\r\n(注意多了一个\r)。当然对于ASCII text文件来说,这些幕后修改是有用的,但是对于其他如JPEG,EXE等其他文件,它将会使二进制数据出现问题。