Python:Bytes对象和Open——如何创建等效文件



我在内存中加载了一个类型为bytes的文件。如何创建相同的文件,就好像从带有open的磁盘加载一样?

考虑以下内容:

type(downloaded_bytes)  # bytes
f = io.StringIO(downloaded_bytes.decode('utf-8')).readlines()
f2 = open(r"file.log", "r").readlines()
f == f2  # false

我在检查文件时注意到,以字节形式检索文件已经取代了换行符。例如,在f2中,一行的内容如下:

'Initializing error logging... Successn',

而在字节派生文件f中,同一行读取:

'Initializing error logging... Successrn',

在其他区域中,字节文件中的n(预期的换行符(将替换为r

如何强制f与此处的f2完全相同?

如果要禁用行尾翻译,同时仍在str上操作,正确的解决方案是将newline=''(或newline=""(传递给open。它仍然对str的输入进行解码,并将任何形式的行分隔符(rnnr(识别为换行符,但它没有将行分隔符规范化为简单的n:

with open(r"file.log", newline='') as f2in:  # Demonstrating with with statement for guarantee close
f2 = f2in.readlines()

或者,为了去掉下载字节中的r,而不是将其保留在从磁盘读取的文件中,最简单的解决方案是自己执行行尾翻译(如果需要获得os.linesep定义,请将import os添加到文件顶部(:

f = io.StringIO(downloaded_bytes.decode('utf-8').replace(os.linesep, 'n')).readlines()

您在Windows上运行。按照惯例,它使用'rn'来终止"0"中的行;文本模式";。在"中打开您的文件;二进制模式";相反:

f2 = open(r"file.log", "rb").readlines()

注意open()的第二个自变量中的尾部b。这样就不会发生行尾翻译。

好吧,不要对二进制内容使用StringIO,使用BytesIO!

from io import BytesIO
f = BytesIO(downloaded_bytes)

最新更新