Python json.dump не работает со словарем

Я пытаюсь записать словарь 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]...}

связанные с? stackoverflow.com/a/11942689/4013571

Alexander McFarlane 13.09.2018 17:36

@AlexanderMcFarlane, наверное, нет. Похоже, проблема здесь в том, что ключ не является строкой (JSON принимает только строки в качестве ключей)

Adam Smith 13.09.2018 17:37

@AlexanderMcFarlane: да, но я не знаю, какой тип является «входящим». Но я запомню этот непонятный вопрос, спасибо!

ItFreak 13.09.2018 17:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
1 407
3

Ответы 3

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() } )

(предполагается, что значение каждый в словаре представляет собой массив целых чисел или строк)

В вопросе указано, что значения также должны быть строкой.

user10356004 13.09.2018 17:43
{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

Alexander McFarlane 13.09.2018 17:44

Спасибо, попробую :)

ItFreak 13.09.2018 17:44

@MoonsikPark Существуют варианты python 2 и python 3 ... Проверьте, какой тип соответствует вашей версии python

Alexander McFarlane 13.09.2018 17:46

Другие вопросы по теме