gpt4 book ai didi

返回比 Linux `wc -l` 高得多的行数的 Python 代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:10 26 4
gpt4 key购买 nike

当我在 Linux 中对一个文件(一个几百万行的 CSV 文件)执行 wc -l 时,它报告的行数低于此 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)我假设您使用的是 Python 3.x,我以 Python 3.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 将其计为一行。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com