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



对于某些大文件,

lines_a = len(fa.readlines())
print(lines_a)

和bash(在Mac上(:

wc -l

结果不同!

可能的原因是什么?

wc -l在输入中打印新线的数量。换句话说,其对"线计数"中"线"的定义需要以新线结尾,实际上是由Posix定义的。

如果文件中的最后一行不会以newline结束,则该行的定义可以产生令人惊讶的行为。尽管在文本编辑器中显示了这样的行,但Pagers却很好,但wc不会将其视为一行。例如:

$ printf 'foonbarn' | wc -l
2
$ printf 'foonbar' | wc -l
1
另一方面,

python的readlines()方法旨在提供文件中的数据,以便可以完美地重构。因此,它为每行提供了最终的newline和最后一个非空行AS-IS(有或没有最终的newline(。在上面的示例中,它分别返回列表["foon", "barn"]["foon", "bar"],这两个长度二:

$ printf 'foonbar' | python -c 'import sys; print len(sys.stdin.readlines())'
2
$ printf 'foonbarn' | 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,这也可能发生。

从流中读取输入时,如果没有新线,则通用启用了新线模式。输入中的行可以以' n',' r'结束,或者' r n',然后将它们翻译成' n'呼叫者。

^来自python textiowrapper文档。

最新更新