Python:动态列表解析与处理

1 投票
2 回答
588 浏览
提问于 2025-04-16 01:12

我启动了一个进程,它正在生成一个字典的列表,类似于下面这个:

[{'foo': '1'},{'bar':2},...]

这个列表生成的时间很长,而且可能会有好几个GB,所以我不想把它全部放到内存里再去处理。

我该怎么做才能在列表还没完全生成的时候,就开始处理每一个字典呢?

2 个回答

0

分别对每个字典进行序列化。使用Shelve可以帮助你完成这个任务。

写入器

import shelve
db= shelve.open(filename)
count= 0
for ...whatever...
    # build the object
    db[count]= object
    count += 1
db['size']= count
db.close

读取器

import shelve
db= shelve.open(filename)
size= db['size']
for i in xrange(size):
    object= db[i]
    # process the object
db.close()
2

Python的分词器是Python标准库的一部分,模块叫做 tokenize。它需要一个 readline 函数来提供输入的“行”,这样它才能逐步处理输入。如果你的输入中没有换行符,你可以通过找到合适的地方来添加换行符来模拟换行,只要不打断一个完整的词就行。因为一开始有个 [,所以所有内容都会被视为一行。唯一需要小心的就是带引号的字符串,避免被拆开。现在我不打算深入讨论这个,因为如果你的输入中本来就有换行符,那就没什么好担心的。

通过这些分词,你可以重建出列表中每个字典的字符串(从开括号到闭括号),然后使用 ast.literal_eval 来得到对应的Python字典。

那么,你的输入中有换行符吗?如果有,那整个任务应该会非常简单。

撰写回答