#python-3.x
#python-3.x
Вопрос:
У меня есть текстовый файл, который я пытаюсь записать в файл JSON. Некоторые значения возвращаются как None, True или False. Мне нужно заменить None на «None» (строка), True на «True» и False на «False»
Я попытался добавить строку
data=data.replace(None,"None")
Однако я получаю сообщение об ошибке
Traceback (most recent call last):
File "parse_get_drivers.py", line 17, in <module>
data=data.replace(None,"None")
TypeError: replace() argument 1 must be str, not None
Вот мой скрипт
import json
import re
from pprint import pprint
import pandas as pd
inHandler = open('get_drivers.txt', 'r')
outHandler = open('drivers.json', 'w')
data = ''
for line in inHandler.readlines():
print('src:' line)
line = line.replace("}]},","}]},r")
data = line
print('replace:' line)
data=data.replace("'", '"')
data=data.replace(None,"None")
outHandler.write(data)
inHandler.close()
outHandler.close()
Требуемый результат — заменить значения None, True и False на «None», «True» и «False».
Комментарии:
1. Это не имеет смысла. Используйте
json.loads
, и особенно если вы не загружаете JSON,True
/False
/None
уже должны быть строковые значения.
Ответ №1:
Вы должны проанализировать входные данные как JSON вместо того, чтобы разбирать их построчно как отдельные строки, чтобы вы могли рекурсивно просматривать структуру данных для замены None
(или в терминах JSON, null
) на "None"
:
def replace(data, search, replacement, parent=None, index=None):
if data == search:
parent[index] = replacement
elif isinstance(data, (list, dict)):
for index, item in enumerate(data) if isinstance(data, list) else data.items():
replace(item, search, replacement, parent=data, index=index)
так что:
import json
d = json.loads('{"a": 1, "b": [1, null], "c": {"d": null}}')
print(d)
replace(d, None, 'None')
print(d)
print(json.dumps(d))
выводит:
{'a': 1, 'b': [1, None], 'c': {'d': None}}
{'a': 1, 'b': [1, 'None'], 'c': {'d': 'None'}}
{"a": 1, "b": [1, "None"], "c": {"d": "None"}}