【发布时间】:2020-02-24 05:40:42
【问题描述】:
我有一个大文件 (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)会发生什么? -
按块计算换行符要慢得多
-
不想这么说,但这听起来像是 C 的工作。
block.count('\n')方法可能很快,但它不能处理引用。因此,您必须逐个字节地浏览文件,将您在每个点的引号内还是在引号外制表(并在跨块时记住)。这在 Python 中会非常慢。您可能会发现使用内存映射文件会有所帮助。您也可以使用 pandas.read_csv(非常快),可能通过 StringIO 给它提供块。但是你会很难知道在哪里打破这些块(回到寻找不带引号的行尾的原始问题)。 -
澄清一下:您实际上感兴趣的是文件中的记录数?
-
@mkrieger1 是的,请
标签: python regex csv regex-lookarounds text-parsing