【问题标题】:Find number of lines in csv without reading it [duplicate]在不阅读的情况下查找csv中的行数[重复]
【发布时间】:2013-10-02 00:06:35
【问题描述】:

是否存在一种无需将整个文件实际加载到内存中(在 Python 中)即可查找 csv 文件中行数的方法?

我希望它可以有一些特殊的优化功能。我现在所能想象的就是逐行阅读并计算行数,但这有点扼杀了其中所有可能的意义,因为我只需要行数,而不是实际内容。

【问题讨论】:

  • 我认为不会。 CSV 不会在文件的页眉或页脚中存储任何元信息。因此获取行数需要读取整个文件。由于这通常是通过读取最多 \r\n 或 \n 的行来实现的(取决于编码),这意味着没有更快的方法可以做到这一点。但是,按字符(而不是按行)读取文件并只计算换行符可能会更快。
  • 不看就确定牛的颜色
  • 副本有一些非常好的答案。我投票决定关闭它……还是我应该删除这个问题?
  • @Hyperboreus 我可以通过查看农场的奶牛数据库来确定奶牛的颜色,而无需去农场和使用光谱仪。
  • @mouviciel - 或者分隔符的数量。或者,如果行数不需要精确:通过文件大小和平均线宽来猜测文件中的(均匀分布?)n 样本集。

标签: python csv


【解决方案1】:

是的,您需要先读取内存中的整个文件,然后才能知道其中有多少行。 只要认为文件是一个长长的字符串 Aaaaabbbbbbbcccccccc\ndddddd\neeeeee\n 要知道字符串中有多少“行”,您需要找出其中有多少 \n 字符。

如果您想要一个近似数字,您可以读取几行 (~20) 并查看每行有多少字符,然后从文件大小(存储在文件描述符中)获得可能的估计值。

【讨论】:

  • 不要使用第一行:它们可能包含不代表实际数据的标题。
  • 这个答案忽略了处理大于内存的文件的许多方法,例如一次只流式传输文件一行并计算行数。
  • 我说的是阅读,而不是存储。即使逐行文件将被移动/读入内存,我将改写为明确
【解决方案2】:

您不需要将整个文件加载到内存中,因为文件可以根据它们的行进行迭代:

with open(path) as fp:
    count = 0
    for _ in fp:
        count += 1

或者,稍微地道一点:

with open(path) as fp:
    for (count, _) in enumerate(fp, 1):
       pass

【讨论】:

  • 在内存中读取整个文件(不存储但读取它)
  • @fabrizioM “读取”,是的,但不是“加载”
  • 好吧,你仍然需要将整个文件读入内存,你只是不必一次将它完全保存在内存中,你可以迭代块。
  • @aychedee “从磁盘读取整个文件” - 是的,“将整个文件加载到内存中” - 不。从讨论中我们可以看出,这就是 OP 所要求的。
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多