添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

4 人关注

对于一些大文件。

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

而对于Bash(在Mac上)。

wc -l

结果是不同的!

可能的原因是什么?

python
bash
Andy Yuan
Andy Yuan
发布于 2017-06-02
3 个回答
user4815162342
user4815162342
发布于 2021-02-26
已采纳
0 人赞同

wc -l prints the number of newlines 在输入中。换句话说,它对 "行数 "中 "行 "的定义要求行以换行结束,实际上是 defined by POSIX .

如果你的文件中的最后一行没有换行,这个行的定义会产生令人惊讶的行为。尽管这样的行在文本编辑器和寻呼机中显示得很好,但 wc 不会将其算作一行。比如说。

$ printf 'foo\nbar\n' | wc -l
$ printf 'foo\nbar' | wc -l

另一方面,Python的readlines()方法被设计为提供文件中的数据,以便可以完美地重构。出于这个原因,它提供了每一行with最后一个换行,以及最后一个非空行的原样(有或没有最后一个换行)。对于上述例子,它分别返回长度为2的列表["foo\n", "bar\n"]["foo\n", "bar"]

$ printf 'foo\nbar' | python -c 'import sys; print len(sys.stdin.readlines())'
$ printf 'foo\nbar\n' | python -c 'import sys; print len(sys.stdin.readlines())'
    
你给了我一个合理的解释,但是我得到了一个大文件,有几百万行,"wc -f "和 "len(readlines()) "的结果不同。 然而,我用一个脚本检查了这个文件,每一行的末尾都只有一个'/n',所以我想一定有别的原因,你还有什么想法吗?
或者我应该问,在Python中是否有办法将 "aaa/nbbb "这样的行作为一个行来处理?
@AndyYuan 对不起,我不知道 wc -f 是做什么的。另外,如果文件这么大,也许它是在 wc 运行时被写入的,这可以解释差异。
@ user4815162342 对不起,我搞错了,应该是'wc -l',我的问题是Python是否有一个函数可以把 "aaa\nbbb\n "这样的行作为一个行。
@AndyYuan "aaa\nbbb\n "是两行。如果你想 "把它当作一行",你怎么知道什么时候停止阅读它?Python 文件对象有一个 read() 方法,可以将整个文件内容作为一个字符串返回;也许你可以使用这个方法,然后根据需要分割得到的字符串。
Zhen Yang
Zhen Yang
发布于 2021-02-26
0 人赞同

我在做机器翻译的时候也遇到过类似的问题。主要原因是行号不对,也许是因为你没有在 "b "模式下打开文件。 所以请尝试

with open('some file', 'rb') as f:
    print(len(f.readlines()))

你会得到与wc -l相同的数字。

Gowtham Ramesh
Gowtham Ramesh
发布于 2021-02-26
0 人赞同

如果你的文本文件中有 \r,也可能发生这种情况。

当从流中读取输入时,如果换行是无,则启用通用换行模式。