![](/img/trans.png)
[英]How to *properly* compress and decompress a text file using bz2 and python
[英]How to parse WIkidata JSON (.bz2) file using Python?
您可以使用BZ2File接口来操作压缩文件。 但是你不能使用json模块来访问它的信息,它会占用太多空间。 您必须索引文件,这意味着您必须逐行读取文件并在Dictionary(哈希表)中保存有趣对象的位置和长度,然后您可以提取给定对象并使用json模块加载它。
我想出了一个策略,允许使用json模块访问信息而无需打开文件:
import bz2
import json
with bz2.open(filename, "rt") as bzinput:
lines = []
for i, line in enumerate(bzinput):
if i == 10: break
tweets = json.loads(line)
lines.append(tweets)
这样lines
将是字典,你可以伊斯利操作,例如,通过删除不需要的键减小其尺寸的列表。
还要注意(显然)条件i==10
可以被任意改变以适合任何人(?)的需要。 例如,您可以一次解析一些行,分析它们并在txt
文件上写入您真正想要从原始文件中获取的行的索引。 比仅读取那些行就足够了(在for
循环中使用i
中的类似条件)。
您必须逐行处理:
import bz2
import json
path = "latest.json.bz2"
with bz2.BZ2File(path) as file:
for line in file:
line = line.decode().strip()
if line in {"[", "]"}:
continue
if line.endswith(","):
line = line[:-1]
entity = json.loads(line)
# do your processing here
print(str(entity)[:50] + "...")
看到 WikiData 现在是 70GB+,您可能希望直接从 URL 处理它:
import bz2
import json
from urllib.request import urlopen
path = "https://dumps.wikimedia.org/wikidatawiki/entities/latest-all.json.bz2"
with urlopen(path) as stream:
with bz2.BZ2File(path) as file:
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.