備忘録も兼ねて、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'))))
コメント