【问题标题】:Get keys in list/dictionary获取列表/字典中的键
【发布时间】:2017-10-27 23:58:51
【问题描述】:

我有一个列表/字典,我正试图从中获取密钥。

我要打印密钥的是get_keys() 函数,这是需要修复的部分。

import json, io
business_json = "business.json"

def read_json(file):
    lines = [line for line in open(file)]
    js = [json.loads(line) for line in lines]
    for item in js:
        name = item.get("name")
    return js

def get_keys(data):
    for key in data.keys():
        print(key)

def get_values_for_category(data, category):
    values = []
    for item in data:
        values.append(item.get(category))
    return values

def main():
    json_data = read_json(business_json) #works
    names = get_values_for_category(json_data, "name") #works 
    get_keys(json_data)


if __name__ == "__main__":
    main()

上面的get_keys(data) 的错误是:

AttributeError: 'list' 对象没有属性 'keys'

如果我改为尝试:

for key, val in data.items():
    print(key, val)

for key in list(data).keys()for key in list(data.keys()) 我遇到了同样的问题。

所以,我有一个清单,需要钥匙。但是,我找到的所有获取列表键的方法都会返回错误。

read_json() 函数中获取js 的方式有问题吗?我很困惑为什么我可以使用键 ("name") 来获取值,但无法返回我可以查找的各种键...

编辑:完整的追溯是:

Traceback (most recent call last):
    File "D:\Batman\Documents\- Datasets\yelp_dataset\dataset\Yelp_analysis.py", line 29, in <module>
        main()<br>
    File "D:\Batman\Documents\- Datasets\yelp_dataset\dataset\Yelp_analysis.py", line 25, in main
        get_keys(json_data)<br>
    File "D:\Batman\Documents\- Datasets\yelp_dataset\dataset\Yelp_analysis.py", line 13, in get_keys
        for key in data.keys():<br> 
AttributeError: 'list' object has no attribute 'keys'

(FWIW .json 文件的摘要是 here,数据的 sn-p 是 here on PasteBin)。

【问题讨论】:

  • 您有列表或目录吗?它们是非常不同的东西。显然错误说列表没有键,所以你需要一个字典
  • 我可以看到整个回溯吗?
  • @cricket_007 - 我以为我有一本字典,使用type(js) 我得到&lt;class 'list'&gt;
  • @cricket_007 你说“它们是绿柱石不同的东西
  • 愚蠢的自动更正 ;) type(data) 在获取键函数中是一个列表

标签: json python-3.x list


【解决方案1】:

这就是您读取文件的方式。

def read_json(file):
    return [json.loads(line) for line in open(file)]

我已经多次看到这个数据集被问及,您可能想查看ijson 库以读取大型 JSON 文件。另外,我个人认为那些 Yelp 文件是为了通过 Hadoop / Spark 进程运行的。

不管怎样,现在这是一个 JSON 对象列表,它们本身有键,而不是列表本身。

如果你打算这样做

json_data = read_json(business_json)
get_keys(json_data)

那么get keys函数应该是这样的

def get_keys(data):
    for obj in data:
        print(obj.keys())

【讨论】:

  • 哦! read_json() 效果很好!当我执行您显示的get_keys() 时,它正确显示了键(耶!),但它正在为成千上万行的 每个对象 执行此操作。 ...我怎么能只显示一次?我试过for obj in data[0]: print(obj.keys()),但得到 `AttributeError 'str' object has no attribute 'keys'。
  • print(data[0].keys())...没有循环
  • 啊,呃!谢谢!!我也会研究 ljson :D
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2010-11-19
  • 2019-03-27
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
相关资源
最近更新 更多