如何在不知道编码的情况下将字节写入 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#?