大型JSON文件:在dict值中进行字符串搜索

时间:2018-11-30 12:53:57

标签: python json python-3.x

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

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

我一直在尝试为与keyvalue匹配的商品获取numquery,如以下示例代码所示:

    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,但是我只能安装第三方库。有没有一种内存有效的替代方法可以在字典values中搜索子字符串?我已经用尽了尝试其他方法的选项,并且不确定为什么会出现此错误。 JSON已排序且有效。

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

1 个答案:

答案 0 :(得分:1)

json的大小在这里不是问题,问题可能是您的字典的某些值是bools(真假),因此您不能通过使用strip()或字符串来对待它们startswith()。在这里,我在字典中添加了'12345': False条目,以引发此错误。

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')]