繁体   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