我在内存中加载了一个类型为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
的输入进行解码,并将任何形式的行分隔符(rn
、n
或r
(识别为换行符,但它没有将行分隔符规范化为简单的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)