備忘録も兼ねて、pythonのdict型データ内の文字列を置換する方法です。
tuple型を含むと単純にできないので、工夫が必要です。
tuple型を含まないdict
import json
if __name__ == "__main__":
test_dict1 = {
'key001': {'teststr':'value001'}
}
test_dict1_after = json.dumps(test_dict1)
test_dict1_after = test_dict1_after.replace('value','VALUE')
test_dict1_after = json.loads(test_dict1_after)
print(test_dict1)
# 置換前のdict出力 -> {'key001': {'teststr': 'value001'}}
print(test_dict1_after)
# 置換後のdict出力 -> {'key001': {'teststr': 'VALUE001'}}tuple型データがないdict型データであれば
json.dumpsでdict型→str型に変換replaceで文字列を置換json.loadsでstr型→dict型に変換
の手順で置換できます。1行で書くとこんな感じになります。
test_dict1_after = json.loads(json.dumps(test_dict1).replace('value','VALUE'))keyがtuple型のdict
※value部分の文字列のみ置換できる方法です。
import json
if __name__ == "__main__":
test_dict2 = {
('tuple001_a','tuple001_b'): {'teststr':'value001'}
}
keys = list(test_dict2.keys())
values = list(test_dict2.values())
values = json.loads(json.dumps(values).replace('value','VALUE'))
test_dict2_after = dict(zip(keys, values))
print(test_dict2)
# 置換前のdict出力 -> {('tuple001_a', 'tuple001_b'): {'teststr': 'value001'}}
print(test_dict2_after)
# 置換後のdict出力 -> {('tuple001_a', 'tuple001_b'): {'teststr': 'VALUE001'}}tuple型が入ったdict型データは、json.dumpsでは以下のエラーが発生し、文字列に変換できません。TypeError: keys must be str, int, float, bool or None, not tuple
そのため、
- dict.keys()とdict.values()でkeyのリストとvalueのリストを取り出す
- valueのリストのデータを「tuple型を含まないdict」に書いた方法で置換
- keyのリストとvalueのリストをつなげて、dict型データを再構築する
という流れで置換しています。
1行で書くとこんな感じになります。
test_dict2_after = dict(zip(list(test_dict2.keys()), json.loads(json.dumps(list(test_dict2.values())).replace('value','VALUE'))))


コメント