我想将数据写入文件,但数据可能因其来源而异。
目前我的代码只执行以下操作:
try:
file.write('{value1}'.format(value1=data["value1"]))
except:
pass
try:
file.write('{value2}'.format(value2=data["value2"]))
except:
pass
#...
由于输入数据的性质,这些值键可能存在也可能不存在,因此我为什么要这样做,所以当我得到KeyError时我可以忽略它。
所以我的问题是,有没有更好的方法来做到这一点?一个更'pythonic'的方式,而不是这个非常潮湿的解决方案?
example_input1:
'{"value1": 1.0, "value2": 1.2}'
example_input2:
'{"value2": 1.5}'
我想最终我应该对输入数据进行标准化,但不幸的是,这是来自第三方API,因此不是真正的选择。
答案 0 :(得分:1)
是的,你可以简单地使用:
for key in ('value1','value2'):
if key in data:
file.write('{}'.format(data[key]))
所以这里if key in data
首先检查字典中是否有密钥(例如'value1'
)。鉴于这种情况,我们使用file.write('{}'.format(data[key]))
将相应的值写入文件。
使用for
循环的优点是,您可以轻松地添加和删除要从文件中打印的键。
另一方面,如果你想要字典中的write
所有键,你可以迭代字典:
for val in data.values():
file.write('{}'.format(val))
请注意,字典中键/值的顺序不一定是插入顺序。所以这些价值可以改组。
答案 1 :(得分:1)
您可以使用json
库将输入字符串转换为类字典对象。
>>> import json
>>> input1 = '{"value1": 1.0, "value2": 1.2}'
>>> input2 = '{"value2": 1.5}'
>>> input1 = json.loads(input1)
>>> input2 = json.loads(input2)
>>> for key in input1.keys():
... print(input1[key])
...
1.2
1.0
>>> for key in input2.keys():
... print(input2[key])
...
1.5
答案 2 :(得分:1)
如果订单在您的情况下不重要,您可以像下面一样循环显示数据:
for v in data.values():
file.write('{}'.format(v))
<强>输出:强>
>>> data = {"value1": 1.0, "value2": 1.2}
>>> for v in data.values():
... print(v)
...
1.2
1.0
>>>
答案 3 :(得分:1)
这取决于,但我认为你不想写你得到的所有数据,但只有一个如果它们存在。
所以这是一种pythonic方式(try
/ except
):
inputs = [
{"value1": "foo", "value2": "bar"},
{"value1": "foo"},
{"value3": "baz", 'unexpected': '??'}
]
expected_keys = ['value1', 'value2', 'value3']
for data in inputs:
for key in expected_keys:
try:
file.write(data[key])
except KeyError:
pass
inputs
只是一个以dict
为例的列表,expected_keys
是您想要在输入中存在的密钥列表。
使用它,您永远不会错过现有密钥,如果缺少密钥,则永远不会提出KeyError
。
这是处理此问题的真正pythonic方式,请参阅Python's EAFP