如何在Python 3中不知编码情况下写字节到文件?

66 投票
2 回答
108270 浏览
提问于 2025-04-16 07:40

在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)

https://docs.python.org/3.3/library/functions.html#open

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可以在任何二进制文件样式的对象上正常工作。所以一般的解决办法就是找到合适的接口。

撰写回答