为啥在尝试从 api 获取数据时出现此错误“TypeError:字符串索引必须是整数”?

Posted

技术标签:

【中文标题】为啥在尝试从 api 获取数据时出现此错误“TypeError:字符串索引必须是整数”?【英文标题】:Why am I getting this error "TypeError: string indices must be integers" when trying to fetch data from an api?为什么在尝试从 api 获取数据时出现此错误“TypeError:字符串索引必须是整数”? 【发布时间】:2021-10-06 15:54:24 【问题描述】:
json file = 
    
      "success": true,
      "terms": "https://curr
      "privacy": "https://cu
      "timestamp": 162764598
      "source": "USD",
      "quotes": 
        "USDIMP": 0.722761,
        "USDINR": 74.398905,
        "USDIQD": 1458.90221
       
      
    

json文件在上面。我从 json 中删除了很多值,因为它占用了太多空间。我的python代码在下面。

    import urllib.request, urllib.parse, urllib.error
    
    import json
    
    response = "http://api.currencylayer.com/live?access_key="
    
    api_key = "42141e*********************"
    parms = dict()
    
    
    
    parms['key'] = api_key
    url = response + urllib.parse.urlencode(parms)
    mh = urllib.request.urlopen(url)    
    source = mh.read().decode()
    
    data = json.loads(source)
    pydata = json.dumps(data, indent=2)
    
    print("which curreny do you want to convert USD to?")
    xm = input('>')
    print(f"Hoe many USD do you want to convertxmto")
    value = input('>')
    
    fetch = pydata["quotes"][0]["USDxm"]
    
    answer = fetch*value 
    
    print(fetch)
--------------------------------

这里是 输出 "fetch = pydata["quotes"][0]["USDxm"] TypeError: 字符串索引必须是整数"

【问题讨论】:

"USDxm" 不能称为列表索引的索引。您所做的通常是为字典完成的。要获取列表的值,只需要整数 根据您的示例数据,pydata['quotes'] 指的是一个字典(不是数组),其键为 'USDIMP'、'USDINR' 和 'USDIQD'。因此,您需要类似 pydata['quotes']['USDINR'] @Sujay 示例 JSON 中没有列表 @Sujay fetch = pydata["quotes"]["USDINR"] TypeError: string indices must be integers ...当我直接添加 INR 时也出现同样的错误 @Sujay 当我直接尝试从 python 字典中获取它时,这是错误 fetch = data["quotes"][0]["USDINR"] KeyError: 'quotes' 【参考方案1】:

首先,您在此处发布的 JSON 数据无效。缺少引号和逗号。例如这里"terms": "https://curr。它必须是"terms": "https://curr","privacy" 相同,"timestamp" 缺少逗号。 修复 JSON 数据后,我找到了解决方案。你必须使用data 而不是pydata。这意味着您必须将fetch = pydata["quotes"][0]["USDxm"] 更改为fetch = data["quotes"][0]["USDxm"]。但这会导致下一个错误,即 KeyError,因为在您提供给我们的 JSON 数据中,"qoutes" 键之后没有数组。所以你必须摆脱这个[0] 或者json数据必须像这样:

"quotes":[
    "USDIMP": 0.722761,
    "USDINR": 74.398905,
    "USDIQD": 1458.90221
   ]

最后,您只需将 data["quotes"]["USDxm"] 更改为 data["quotes"]["USD"+xm],因为当您在输入中键入“IMP”时,python 会尝试查找名为 USDxm 而不是 USDIMP 的键。我希望这可以解决您的问题。

【讨论】:

非常感谢 Felix,是的,它成功了。这是我的第一个python项目,你帮我完成了。再次,非常感谢。???

以上是关于为啥在尝试从 api 获取数据时出现此错误“TypeError:字符串索引必须是整数”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试将 UIPopover 附加到不同类中的 UIButton 时出现此构建错误?

为啥当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时出现此错误?

运行天气应用程序时出现此错误我正在使用 json 和 http 库来获取数据但我不知道为啥会出现此错误

为啥在尝试使用指针访问结构时出现此分段错误?

为啥调用 API 时出现 CORS 错误

尝试从反应应用程序连接到 graphcool 中继 API 时出现此错误:模块构建失败:错误:没有有效的 GraphQL 端点