簡體   English   中英

如何檢查 StringIO 文件使用的是什么線?

[英]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.TextIOWrappernewline參數的默認值不同於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM