当我在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/