如何在Python 3中不知编码情况下写字节到文件?
在Python 2.x中,使用“类似文件”的对象:
sys.stdout.write(bytes_)
tempfile.TemporaryFile().write(bytes_)
open('filename', 'wb').write(bytes_)
StringIO().write(bytes_)
那么在Python 3中怎么做呢?
如何写出与这个Python 2.x代码等效的代码:
def write(file_, bytes_):
file_.write(bytes_)
注意:sys.stdout
并不总是语义上是一个文本流。有时候把它当作字节流来考虑会更有帮助。例如,在远程机器上制作目录的加密归档:
tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg'
在这种情况下使用Unicode是没有意义的。
2 个回答
33
当你打开文件的时候,要指定二进制模式,也就是加上'b':
with open('myfile.txt', 'wb') as w:
w.write(bytes)
75
这其实是使用处理字节的接口,而不是处理字符串的接口。
sys.stdout.buffer.write(bytes_)
正如文档所解释的,你也可以通过detach
来分离这些流,这样它们默认就是二进制的。
这样就可以访问底层的字节缓冲区。
tempfile.TemporaryFile().write(bytes_)
这已经是一个字节接口了。
open('filename', 'wb').write(bytes_)
从'b'这个前缀你就可以猜到,这也是一个字节接口。
from io import BytesIO
BytesIO().write(bytes_)
BytesIO
是字节版的StringIO
。
补充说明:write
可以在任何二进制文件样式的对象上正常工作。所以一般的解决办法就是找到合适的接口。