【问题标题】:Python CSV reader start at line_numPython CSV 阅读器从 line_num 开始
【发布时间】:2014-02-13 18:09:51
【问题描述】:

我需要读取包含几百万行的 CSV。该文件全天都在增长。每次处理文件(并将每一行压缩到一个字典)之后,我都会重新开始这个过程,除了只为新行创建字典。

不过,为了进入新行,我必须使用 CSV 阅读器遍历每一行,并将行号与我的“最后一行读取”号进行比较(据我所知)。

有没有办法“跳过”到该行号?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您无法转到特定的行号,除非行的大小是固定的并且您知道该大小。当我说你不能时,我的意思是你不能不将整个文件加载到内存中并按\n 字符分割。

    如果您的 CSV 具有这样的固定行大小:

    id,code,quantity
    0001,ABC43,00100
    0002,D2ZAD,00020
    ....
    

    如果每条线的长度相同,那么您可以移动到linesize*(linenumber+1),其中linenumber 是您要移动的线。
    否则,您需要遍历整个文件以获取n-th 行...它存在一个内置模块,名称为linecache,但是可以为您提供帮助:Go to a specific line in Python?

    【讨论】:

    • 非常感谢您的回复。今天下午我会试试linecache。
    • 我有点好奇,一旦我使用 linecache 到达特定行后如何继续。
    • 我真的不知道linecache 在内部是如何工作的。您可以通过从linenumber 获取linecache.getline(filename, n)n 来迭代每一行,并在它返回一个空字符串时停止(意味着根据文档该行不存在)。检查性能,但文档说linecache 管理内部缓存,所以应该没问题。
    • 我正在想象使用 linecache,我可以指示它抓取从特定行到文件末尾的所有行(或固定数量的行,例如,一次 20,000 行) .如果 linecache 一次只能抓取一行,我认为它不会导致一个简单或优雅的解决方案。显然我会继续研究...谢谢...
    【解决方案2】:

    如果我这样做,我想我会在每次读取之后添加一个标记行 - 在再次保存文件之前,然后我会将文件作为字符串读取,在标记上拆分,转换回列表并提供进程列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多