【发布时间】:2019-08-06 17:51:10
【问题描述】:
对于某些第三方 API,API 参数中有大量数据需要发送。输入数据以 CSV 格式进入我们的应用程序。
我收到 CSV 的所有行,包含大约 120 列,由 CSV DictReader 以平面 dict 格式。
file_data_obj = csv.DictReader(open(file_path, 'rU'))
这给了我以下格式的每一行:
CSV_PARAMS = {
'param7': "Param name",
'param6': ["some name"],
'param5': 1234,
'param4': 999999999,
'param3': "some ",
'param2': {"x name":"y_value"},
'param1': None,
'paramA': "",
'paramZ': 2.687
}
并且有一个嵌套字典,其中包含所有第三方 API 参数作为具有空白值的键。
eg. API_PARAMS = {
"param1": "",
"param2": "",
"param3": "",
"paramAZ": {
"paramA": "",
"paramZ": {"test1":1234, "name":{"hello":1}},
...
},
"param67": {
"param6": "",
"param7": ""
},
...
}
我必须将所有 CSV 值动态映射到 API 参数。以下代码有效,但最多只能嵌套 3 级。
def update_nested_params(self, paramdict, inpdict, result={}):
"""Iterate over nested dictionary up to level 3 """
for k, v in paramdict.items():
if isinstance(v, dict):
for k1, v1 in v.items():
if isinstance(v1, dict):
for k2, _ in v1.items():
result.update({k:{k1:{k2: inpdict.get(k2, '')}}})
else:
result.update({k:{k1: inpdict.get(k1, '')}})
else:
result.update({k: inpdict.get(k, '')})
return result
self.update_nested_params(API_PARAMS, CSV_PARAMS)
对于 API 参数的 n 次嵌套,是否有其他有效的方法来实现这一点?
【问题讨论】:
-
不相关:将 result 的默认值设置为
{}如果您多次调用它可能会给您带来意想不到的副作用 ... -
你真的不想在这里使用
result={}作为默认关键字参数,请参阅"Least Astonishment" in Python: The Mutable Default Argument
标签: python csv dictionary