如何使用 Python 解析 WIkidata JSON (.bz2) 文件?

How to parse WIkidata JSON (.bz2) file using Python?

我想使用维基数据查看实体和关系。我下载了 Wikidata JSON 转储(from here .bz2 文件,大小约为 18 GB)。

但是,我无法打开该文件,它对我的​​电脑来说太大了。

有没有办法在不提取完整 .bz2 的情况下查看文件 文件。特别是使用 Python,我知道有一个 PHP 转储 reader (here ),但我不能使用它。

您可以使用BZ2File界面来操作压缩文件。但是你不能使用 json 模块来访问它的信息,它会占用太多 space。您将必须索引文件,这意味着您必须逐行读取文件并将感兴趣的对象的位置和长度保存在字典(哈希表)中,然后您可以提取给定的对象并使用 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:
        ...