【发布时间】:2014-02-13 18:09:51
【问题描述】:
我需要读取包含几百万行的 CSV。该文件全天都在增长。每次处理文件(并将每一行压缩到一个字典)之后,我都会重新开始这个过程,除了只为新行创建字典。
不过,为了进入新行,我必须使用 CSV 阅读器遍历每一行,并将行号与我的“最后一行读取”号进行比较(据我所知)。
有没有办法“跳过”到该行号?
【问题讨论】:
我需要读取包含几百万行的 CSV。该文件全天都在增长。每次处理文件(并将每一行压缩到一个字典)之后,我都会重新开始这个过程,除了只为新行创建字典。
不过,为了进入新行,我必须使用 CSV 阅读器遍历每一行,并将行号与我的“最后一行读取”号进行比较(据我所知)。
有没有办法“跳过”到该行号?
【问题讨论】:
您无法转到特定的行号,除非行的大小是固定的并且您知道该大小。当我说你不能时,我的意思是你不能不将整个文件加载到内存中并按\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 在内部是如何工作的。您可以通过从linenumber 获取linecache.getline(filename, n) 和n 来迭代每一行,并在它返回一个空字符串时停止(意味着根据文档该行不存在)。检查性能,但文档说linecache 管理内部缓存,所以应该没问题。
如果我这样做,我想我会在每次读取之后添加一个标记行 - 在再次保存文件之前,然后我会将文件作为字符串读取,在标记上拆分,转换回列表并提供进程列表。
【讨论】: