2

我想使用 Wikidata 查看实体和关系。我下载了 Wikidata JSON 转储(来自此处的.bz2 文件,大小约为 18 GB)。

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

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

4

3 回答 3

4

我想出了一个策略,允许使用 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您真正想要的原始文件中的行的索引写入文件。仅读取这些行就足够了(ifor循环中使用类似的条件)。

于 2019-02-20T23:05:35.780 回答
2

您可以使用BZ2File接口来操作压缩文件。但是你不能使用 json 模块来访问它的信息,它会占用太多空间。您必须索引文件,这意味着您必须逐行读取文件并将感兴趣对象的位置和长度保存在字典(哈希表)中,然后您可以提取给定对象并使用 json 模块加载它。

于 2018-01-03T13:54:15.697 回答
0

您必须逐行处理:

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:
        ...
于 2021-10-18T14:42:48.167 回答