我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... Success\n',
在位元組派生檔案中f,同一行顯示:
'Initializing error logging... Success\r\n',
在其他區域,\n(預期的換行符)\r在位元組檔案中被替換。
我怎么能強迫f自己像f2這里一樣?
uj5u.com熱心網友回復:
如果您想禁用行結束翻譯,同時仍在操作str,正確的解決方案是傳遞newline=''(或newline="")到open. 它仍然將輸入解碼為str,并將任何形式的行分隔符( 或 )識別\r\n為\n換行符\r,但它不會將行分隔符標準化為簡單的\n:
with open(r"file.log", newline='') as f2in: # Demonstrating with with statement for guarantee close
f2 = f2in.readlines()
或者,要擺脫\r下載的位元組而不是將其保留在從磁盤讀取的檔案中,最簡單的解決方案是自己執行行尾轉換(import os如果需要,添加到檔案頂部以獲得os.linesep定義):
f = io.StringIO(downloaded_bytes.decode('utf-8').replace(os.linesep, '\n')).readlines()
uj5u.com熱心網友回復:
您正在 Windows 上運行。按照慣例,它'\r\n'用于終止“文本模式”中的行。改為以“二進制模式”打開檔案:
f2 = open(r"file.log", "rb").readlines()
b注意第二個引數的結尾open()。然后不會發生行尾翻譯。
uj5u.com熱心網友回復:
好吧,不要將 StringIO 用于二進制檔案,使用BytesIO!
from io import BytesIO
f = BytesIO(downloaded_bytes)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444407.html
標籤:Python
上一篇:Django-(admin.E015)'exclude'的值包含重復的欄位
下一篇:每個影像之間有填充空白
