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

标签 python linux string file csv

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

相关文章:

java - java 包含特定字符的字符串数组列表

Python ssl 服务器报告 TLSV1_ALERT_UNKNOWN_CA

python - 为什么在 python 3.5 中使用 asyncio 时出现被忽略的异常

python - 无法在 Win7 上将 python.exe 设置为 *.py 脚本

python - 在包含数字和对象的数组上使用 NumPy 函数

linux - 集成 VSCode (Code - OSS) 终端中的重音

c# - 从 C# 编码 "as string"参数

c++ - hiredis SET 遇到段错误

linux - 如何在 Linux Web 服务器上创建快捷方式文件夹?

javascript - 将文本字符串转换为 JSON 格式 - Javascript