簡體   English   中英

為什么 Python 的 len(readlines) 不等於 Bash 的 'wc -l' 命令?

[英]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.

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