Я пытаюсь записать словарь Python в файл в нотации json. Вот как я это пробовал:
def write_to_json(self, data):
with open('dict.json', 'w') as file:
json.dump(data, file)
Однако метод dump
не подходит для моего словаря. Он говорит:
TypeError: key 23 is not a string
Это (действительно) правильно, это должен быть Integer
, но поскольку данные изначально считываются из файла csv и обрабатываются, я не могу гарантировать, поэтому мне нужно их преобразовать.
Как я могу преобразовать каждый элемент словаря (как ключ, так и значения) в строку?
Вот как выглядит пример словаря (его основной ключ -> список):
{1: [5,6,8,6], 2: [7,8,9]...}
@AlexanderMcFarlane, наверное, нет. Похоже, проблема здесь в том, что ключ не является строкой (JSON принимает только строки в качестве ключей)
@AlexanderMcFarlane: да, но я не знаю, какой тип является «входящим». Но я запомню этот непонятный вопрос, спасибо!
newdict = { str(k):str(v) for k,v in olddict.items() }
или, даже не сохраняя его в промежуточную переменную:
json.dump( { str(k):v for k,v in data.items() }, file )
Это преобразует только ключи (это все, что действительно нужно JSON - значения JSON могут быть целыми числами или другими вещами).
Если вам нужно преобразовать данные все, может быть лучше сделать это перед построением словаря из входных данных, но если это не вариант, это должно работать (ТОЛЬКО если данные точно такие, как вы их показываете, обратите внимание, что создание конвертер, который найдет любое целое число во вложенной структуре и преобразует его в строку, также возможен, но немного сложнее):
json.dump( { str(k):[str(i) for i in v] for k,v in data.items() } )
(предполагается, что значение каждый в словаре представляет собой массив целых чисел или строк)
В вопросе указано, что значения также должны быть строкой.
{str(k): [str(x) for x in v] for k, v in array.items()}
>>> {str(k) : [str(x) for x in v] for k, v in a.items()}
{'1': ['1', '2', '3'], '2': ['1', '2']}
Это должно делать то, что вы хотите в python 2
json.dump({str(k): map(str, v) for k, v in data.iteritems()}, file)
и питон 3
json.dump({str(k): list(map(str, v)) for k, v in data.items()}, file)
Обратите внимание, что простой способ проверить, работает ли это, - использовать метод json.dumps
в качестве теста, например.
In [489]: data = {1: [5,6,8,6], 2: [7,8,9]}
In [490]: json.dumps({str(k): map(str, v) for k, v in data.iteritems()})
Out[490]: '{"1": ["5", "6", "8", "6"], "2": ["7", "8", "9"]}'
Я добавил вариант Python 3
Спасибо, попробую :)
@MoonsikPark Существуют варианты python 2 и python 3 ... Проверьте, какой тип соответствует вашей версии python
связанные с? stackoverflow.com/a/11942689/4013571