对于一些大文件,
lines_a = len(fa.readlines())
print(lines_a)
Run Code Online (Sandbox Code Playgroud)
而对于Bash(在Mac上):
wc -l
Run Code Online (Sandbox Code Playgroud)
结果是不同的!
可能的原因是什么?
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)