当我在linux中的一个文件上执行wc -l操作(一个包含数百万行的csv文件)时,它报告的行数比python代码显示的行数(只需遍历文件中的行)要低一千多行。那是什么原因呢?

with open(csv) as csv_lines:
    num_lines = 0
    for line in csv_lines:
        num_lines += 1
    print(num_lines)

我遇到过wc比上面少报告一个的情况,这在文件没有终止换行符的情况下是有意义的,因为似乎wc计算完整行(包括终止换行符),而此代码只计算任何行。但如果超过一千行的话,会有什么不同呢?
我对行尾之类的东西不太了解,所以可能我误解了wc和这个python代码是如何计算行的,所以也许有人可以澄清一下。在linux lines counting not working with python code中,它说wc通过计算文件中的\n字符数来工作。但是,这条python代码到底在做什么呢?
有没有办法调和数字上的差异,以找出究竟是什么原因造成的?类似于从python计算行数的方法,其计数方式与wc相同。
该文件可能是在linux的另一个平台上生成的,不确定是否与此相关。

最佳答案

因为您使用的是print(num_lines)我假设您使用的是Python3.x,并且我使用了Python3.4.2作为示例。
行数不同的原因在于open(<name>)打开的文件将\r\n字符作为单独的行以及\r\n组合(docs,通用换行部分)进行计数。这将导致以下情况:

>>> with open('test', 'w') as f:
        f.write('\r\r\r\r')

>>> with open('test') as f:
        print(sum(1 for _ in f))
4

wc -l给出:
$ wc -l test
0 test

\r字符用作旧Macintosh系统中的换行符。
如果只希望拆分\n个字符,请使用newline关键字参数来open
>>> with open('test', 'w') as f:
        f.write('\r\r\r\r')

>>> with open('test', newline='\n') as f:
        print(sum(1 for _ in f))
1

1来自您已经提到的事实。文件中没有一个\n字符,因此wc -l返回0,python将其计为一行。

关于python - 返回的行数比Linux`wc -l`高得多的Python代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27998980/

10-11 04:05
查看更多