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

And*_*uan 0 python bash

对于一些大文件,

lines_a = len(fa.readlines())
print(lines_a)
Run Code Online (Sandbox Code Playgroud)

而对于Bash(在Mac上):

wc -l
Run Code Online (Sandbox Code Playgroud)

结果是不同的!

可能的原因是什么?

use*_*342 7

wc -l打印输入中的换行符数.换句话说,它在"行计数"中对"行"的定义要求行以换行结束,并且实际上由POSIX定义.

如果文件中的最后一行不以换行符结尾,则此行的定义可能会产生令人惊讶的行为.尽管这样的行在文本编辑器和寻呼机中显示得很好,但wc不会将其视为一条线.例如:

$ printf 'foo\nbar\n' | wc -l
2
$ printf 'foo\nbar' | wc -l
1
Run Code Online (Sandbox Code Playgroud)

readlines()另一方面,Python的方法旨在提供文件中的数据,以便可以完美地重建它.因此,它为每一行提供最终换行符,并为最后一行非空行提供(有或没有最终换行符).对于上面的示例,它分别返回列表["foo\n", "bar\n"]["foo\n", "bar"]长度为二的列表:

$ 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
Run Code Online (Sandbox Code Playgroud)