我有一个超大文件(30GB+)的csv文件,我正在逐个块地解析该文件以计算换行符的数量
使用以下函数:
def yieldblocks(file, size=1024*1024):
while True:
blocks = file.read(size)
if not blocks: break
yield blocks
并这样调用它,
sum(bl.count("\n") for bl in blocks(txtfile))
我可以在一个小时内计算出换行符的数量(我很惊讶这是我能做到的最好成绩)。
我的问题在于我需要跳过双引号内的换行符,因为某些列有多行内容。
我尝试了下面的方法,但似乎不起作用,处理过程没有结果。
sum(.5 if re.search('^[^"]*"(?=[^"]*(?:"[^"]*")*[^"]*$).*$', bl) else 1 for bl in yieldblocks(txtfile))
这个正则表达式是为了在一行中查找奇数个双引号字符,并适用于小文件。
我使用的是2GB RAM和32位操作系统。
注意:我已经尝试使用CSV模块,但与按块计数相比速度较慢,希望能找到一种方法使其工作。
sum(1 for line in file)
会发生什么? - mkrieger1block.count('\n')
方法可能很快,但它无法处理引用。因此,您必须逐字节地浏览文件,在每个点上记录您是否在引号内或外部(并在跨块时记住)。这在Python中将非常慢。您可能会发现使用内存映射文件有所帮助。您还可以使用pandas.read_csv(非常快),可能通过StringIO提供块。但是,您将难以知道在哪里断开这些块(回到找到未引用行结尾的原始问题)。 - Matthias Fripp