![](/img/trans.png)
[英]For sets S and T, why does Python's S -= T take O(len(T)) and not O(len(S))?
[英]Why doesn't Python's len(readlines) equal Bash's 'wc -l' command?
對於一些大文件,
lines_a = len(fa.readlines())
print(lines_a)
對於 Bash(在 Mac 上):
wc -l
結果不一樣!
可能的原因是什么?
wc -l
打印輸入中的換行數。 換句話說,它在“行數”中對“行”的定義要求該行以換行符結尾,並且實際上是由 POSIX 定義的。
如果文件中的最后一行不以換行符結尾,則此 line 定義可能會產生令人驚訝的行為。 盡管這樣的行在文本編輯器和尋呼機中顯示得很好,但wc
不會將其視為一行。 例如:
$ printf 'foo\nbar\n' | wc -l
2
$ printf 'foo\nbar' | wc -l
1
另一方面,Python 的readlines()
方法旨在提供文件中的數據,以便可以完美地重建它。 出於這個原因,它為每一行提供了最后的換行符,以及最后一個非空行(有或沒有最后的換行符)。 對於上面的示例,它分別返回列表["foo\\n", "bar\\n"]
和["foo\\n", "bar"]
,長度均為 2:
$ printf 'foo\nbar' | python -c 'import sys; print len(sys.stdin.readlines())'
2
$ printf 'foo\nbar\n' | python -c 'import sys; print len(sys.stdin.readlines())'
2
順便提一下,我在做機器翻譯任務時遇到了類似的問題。 行號不對的主要原因,可能是你沒有以'b'模式打開文件。 所以嘗試
with open('some file', 'rb') as f:
print(len(f.readlines()))
您將獲得與wc -l
相同的數字
如果您的文本文件中有 \\r,也可能發生這種情況。
從流中讀取輸入時,如果換行符為 None,則啟用通用換行符模式。 輸入中的行可以以 '\\n'、'\\r' 或 '\\r\\n' 結尾,這些在返回給調用者之前會被轉換為 '\\n'。
^ 來自 python textiowrapper 文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.