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

Posted

技术标签:

【中文标题】如何在不知道编码的情况下将字节写入 Python 3 中的文件?【英文标题】:How to write bytes to a file in Python 3 without knowing the encoding? 【发布时间】:2011-05-16 11:57:39 【问题描述】:

在带有“类文件”对象的 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 在语义上并不总是文本流。有时将其视为字节流可能会有所帮助。例如make encrypted archive of dir/ on remote machine:

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

在这种情况下使用 Unicode 是没有意义的。

【问题讨论】:

【参考方案1】:

这是使用对字节而不是字符串进行操作的 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 将适用于任何类似 binary 文件的对象。所以一般的解决办法就是找到合适的API。

【讨论】:

有没有办法编写通用函数而不求助于类型检查,例如isinstance(file_, io.TextIOWrapper) @J.F.,Python 3 专门设计用于正确处理文本与二进制除法。在不知道编码的情况下,二进制和文本之间没有正确的方法。所以没有办法编写一个将字节写入文本流的通用函数。 Dive Into Python 3 对此有很好的article。 这个问题是关于 bytes 的。例如,os.write(sys.stdout.fileno(), bytes_) 所以答案是:传递一个 '.write()' 方法接受字节的对象;没有捷径。 @MatthewFlaschen:显示错误NameError: name 'bytes_' is not defined,当open('filename', 'wb').write(bytes_)【参考方案2】:

打开文件时指定二进制模式“b”:

with open('myfile.txt', 'wb') as w:
    w.write(bytes)

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

【讨论】:

以上是关于如何在不知道编码的情况下将字节写入 Python 3 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

在不知道编码类型的情况下将 NSData 转换为 NSString

Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC

如何在不复制列标签的情况下将多个数据框写入同一张表

如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?

如何在不写入磁盘的情况下将 AWS S3 上的文本文件导入 pandas

如何在不使用 PHP 将文件写入磁盘的情况下将文件发布到 REST 服务器?