[英]How to check what lineending a StringIO file is using?
我有一種檢測行尾的方法
def getLineEnding(filename):
ret = "\r\n"
with open(filename, 'r') as f:
f.readline()
ret = f.newlines
return ret
為了能夠在不使用真實文件的情況下對其進行測試,我將其更改為:
def getLineEnding(filehandle):
filehandle.readline()
return filehandle.newlines
這適用於文件。 但是當我這樣做時:
f = StringIO()
f.write('test\r\n')
f.seek(0)
f.readline()
print(f.newlines)
我None
我檢查文件結尾的原因是我正在編寫一個處理文本文件的程序,並且我想保留原始行結尾。
要回答您的問題, io.TextIOWrapper
的newline
參數的默認值不同於io.StringIO
(由open(..., 'r')
返回)。 對於StringIO
,默認值為'\n'
而對於TextIOWrapper
,默認值為None
。 該文檔解釋了該行為:
換行控制如何處理行尾。 它可以是
None
、''
、'\n'
、'\r'
和'\r\n'
。 它的工作原理如下:
- 從 stream 讀取輸入時,如果換行符為
None
,則啟用通用換行符模式。 輸入中的行可以以'\n'
、'\r'
或'\r\n'
結尾,這些行在返回給調用者之前會被翻譯成'\n'
。 如果換行符是''
,則啟用通用換行符模式,但行尾未翻譯返回給調用者。 如果換行符具有任何其他合法值,則輸入行僅由給定字符串終止,並且行尾未翻譯返回給調用者。- [...]
這意味着TextIOWrapper
將翻譯行尾,而StringIO
默認情況下不會。 那么newlines
屬性的文檔是:
一個字符串、一個字符串元組或無,表示到目前為止已翻譯的換行符。 [...]
因此,如果不執行翻譯,則不會設置此屬性( StringIO
就是這種情況)。
解決方案是通過傳遞newline=None
來構造StringIO
,即
f = StringIO(newline=None)
然后行為 w.r.t。 行尾將類似於TextIOWrapper
。
但是,如果目標是保持行尾不變,則可以直接使用newline=''
來返回未翻譯的行尾,如上述文檔中的引用所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.