如何在不知道编码的情况下将字节写入Python 3中的文件?

时间:2010-11-27 08:17:46

标签: python io python-3.x

在Python 2.x中使用'file-like'对象:

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在语义上并不总是文本流。有时将它视为字节流可能是有益的。例如,make encrypted archive of dir/ on remote machine

tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg'

在这种情况下没有必要使用Unicode。

2 个答案:

答案 0 :(得分:51)

这是使用以字节而不是字符串操作的API的问题。

sys.stdout.buffer.write(bytes_)

正如docs解释的那样,您还可以detach这些流,因此默认情况下它们是二进制的。

这将访问基础字节缓冲区。

tempfile.TemporaryFile().write(bytes_)

这已经是一个字节API。

open('filename', 'wb').write(bytes_)

正如您对'b'所期望的那样,这是一个字节API。

from io import BytesIO
BytesIO().write(bytes_)

BytesIO是等同于StringIO的字节。

编辑:write将在任何二进制文件类对象上工作。所以一般的解决方案就是找到合适的API。

答案 1 :(得分:16)

打开文件时指定二进制模式' b'

::1

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