Как заменить значение None на строковое значение «None»

#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"}}