【问题标题】:Python: How to remove symbol in dict?Python:如何删除字典中的符号?
【发布时间】:2018-11-24 03:51:30
【问题描述】:

我得到一个 xml 响应,它以字节为单位并由 xmltodict 解析,如下所示。由于我需要进一步使用响应,因此我想消除键中的所有'@'。我尝试了两种删除标志的方法,但仍然无法正常工作。有什么方法可以删除字典中的登录吗?

XML response (resp.text): {'HOLDING_QUERY_RESPONSE': OrderedDict([('@LOGIN_ID', '011'), ('@CLIENT_ID', '011'), ('@CHANNEL', 'MB'), ('@SESSION_KEY', '111'), ('RESULT', OrderedDict([('@STATUS', 'OK'), ('BUYING_POWER', '98’),( 'USD_BUYING_POWER', '12'), ('AVAILABLE_MKT_VAL', '110'), ('CASH_HOLDING', OrderedDict([('LINEITEM', [OrderedDict([('@CURRENCY_CODE', 'USD'), ('@AVAILABLE_BAL', '-233'), ('@CASH_BALANCE', '0.00'), ('@CASH_ON_HOLD', '0.00'), ('@UNSETTLED_CASH', '0.00'), ('@ACCRUED_INTEREST', '0.00'), ('@BUY_SOLD_CONSIDERATION', '-233'), ('@EX_RATE', '1'), ('@AVAILABLE_VAL', '6'), ('@AMT', '0.00'), ('@DUE_AMT', '0.00')]),…….)])])]))]))])}

第一次尝试的方法。错误是 dict 对象没有属性“iteritems()”。如果我删除 '.iteritem()',它会显示 Value Error: too many value to unpack.

info = {key.replace('@',''): item for key, item in xmltodict.parse(resp.text).iteritems()}
print(info)

第二次尝试的方法是先将其更改为字符串,然后再将其翻译回dict。但是,dict 似乎仍然没有被 json.dumps 转换为字符串。

info = json.dumps(resp.text)
info.replace('@','')
to_dict = json.loads(info)
print(to_dict)

【问题讨论】:

  • 尝试.items() 而不是.iteritems()。您可能正在使用 Python 3。
  • 感谢您的回复,奥斯汀。我之前试过这个,但仍然显示 dict 对象没有 item() 属性。
  • 它是items()
  • info.replace('@','') 返回一个新字符串,顺便说一下,你忽略了

标签: python json xml response


【解决方案1】:

试试这个:

info = {key.replace('@',''): item for key, item in xmltodict.parse(resp.text).items()}
print(info)

如 cmets 中所述,xmltodict.parse 返回字典,在您的情况下,您可能正在使用 Python 3,因此请使用 .items() 属性访问字典。

举个例子:

d = ('@CASH', '0.00'), ('@INTEREST', '0.00'), ('@BUY', '-233'), ('@RATE', '1.000000'), ('@AVAILABLE', '6,228'), ('@AMT', '0.00')
info = {key.replace('@',''): item for key, item in d}

print(info)
>>
{'CASH': '0.00', 'INTEREST': '0.00', 'BUY': '-233', 'RATE': '1.000000', 'AVAILABLE': '6,228', 'AMT': '0.00'}

更新的问题解决方案

同样,如果它是嵌套字典,您必须访问要在其值中替换 @ 的键,从您更新的示例中,您应该能够使用 xmltodict.parse(resp.text)['HOLDING_QUERY_RESPONSE'] 访问嵌套字典。

from collections import OrderedDict

#based on your updated data structure
d = OrderedDict([('@CASH', '0.00'), ('@INTEREST', '0.00'), ('@BUY', '-233'), ('@RATE', '1.000000'), ('@AVAILABLE', '6,228'), ('@AMT', '0.00')])
xml_response = {}
xml_response['HOLDING_QUERY_RESPONSE'] = d

xml_response
{'HOLDING_QUERY_RESPONSE': OrderedDict([('@CASH', '0.00'),
              ('@INTEREST', '0.00'),
              ('@BUY', '-233'),
              ('@RATE', '1.000000'),
              ('@AVAILABLE', '6,228'),
              ('@AMT', '0.00')])}

info = {key.replace('@',''):value for key, value in xml_response['HOLDING_QUERY_RESPONSE'].items()}
print(info)

【讨论】:

  • 谢谢,现在错误消失了,但我发现@符号还在。
  • 我添加了一个示例,它应该可以工作并且非常简单。您是否访问了正确的变量?
  • 我还编辑了 resp.text。实际上字典是这样的并且有很多层。是否影响简单使用上述代码的结果?
  • @WILL 这仅适用于字典的顶级键
  • 我根据更新编辑了我的答案,如果这里的任何答案解决了您的问题,请接受最好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2021-02-04
  • 2016-10-30
相关资源
最近更新 更多