1

我有一个包含大约 30,000 个项目的大型 JSON 文件,其中包含以下项目:

d = {"1102344": "Install 3245 xxx", "23456": "Install 7896 zzz", "90887": "Install 6655 ddd"}

我一直在尝试为匹配的项目获取key, ,如下面的示例代码所示:valuenumquery

    def test(num, query):
        l = [(k,v) for k,v in d.items() if num in v and v.strip().startswith(query)]
        return l
    test('3245','Install')
#Output: [('1102344', 'Install 3245 xxx')]

上面的代码作为字典d的项目很少。但是,当我为我的数据集运行它时,我收到以下错误:

argument of type `bool` is not iterable

我四处寻找有关 SO 的帮助,许多答案都指向使用ijson,但我仅限于安装第三方库。是否有一种节省内存的替代方法来搜索 dict 中的子字符串values?我已经用尽了尝试不同事物的选项,但不确定为什么会出现此错误。JSON 是有序的并且是有效的。

只是为了让您知道,它以前可以工作,但现在我在 5 次中出现 3 次出现此错误。因此该错误间歇性地出现,但对于应用程序执行其工作来说非常频繁。JSON 文件或代码没有任何变化,但是,JSON 文件大小增加了,这让我认为这可能是原因。

4

1 回答 1

1

json 的大小在这里不是问题,问题是您的 dict 的某些值可能是bools(True of False),因此您不能使用strip()or将它们视为字符串startswith()。在这里,我添加了'12345': False条目 yo 我们的 dict 以引发此错误。

d = {"1102344": "Install 3245 xxx", '12345': False, "23456": "Install 7896 zzz", "90887": "Install 6655 ddd"}

def test(num, query):
    l = [(k,v) for k,v in d.items() if type(v) is not bool and num in v and v.strip().startswith(query)]
    return l
print(test('3245','Install'))

输出:

TypeError: argument of type 'bool' is not iterable

您可以做的是在您的函数中首先检查值类型是否不是布尔值,或者如果它的字符串更好。

l = [(k,v) for k,v in d.items() if type(v) is str and num in v and v.strip().startswith(query)]

输出:

[('1102344', 'Install 3245 xxx')]
于 2018-11-30T12:59:55.840 回答