![](/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.