2017-06-02 182 views

回答

6

wc -l在输入中打印number of newlines。换句话说,它在“行数”中的“行”定义要求行以换行符结束,实际上是defined by POSIX

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

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

Python的readlines()方法,在另一方面,被设计为在该文件中提供的数据,以便它可以被完美地重建。因此,它为每行提供最后一个换行符,并且最后一个非空行按原样(带或不带最后的换行符)。对于上面的例子,它分别返回列表["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 
+0

你给我一个合理的解释,但我有一个大的文件,数百万行的,从“WC的不同结果 - f“和”len(readlines())“,但是,我通过一个脚本检查这个文件,每行只在行尾包含一个'\ n',所以我想必须有另一个原因,你有还有什么想法? –

+0

或者我应该问一下,有没有办法在python中将这样的行像“aaa \ nbbb”那样视为一行? –

+0

@AndyYuan对不起,我不知道'wc -f'是干什么的。另外,如果文件太大,可能是在'wc'运行时写入的,这可以解释不同之处。 – user4815162342