Python: Ошибка при чтении и замене строки (со специальными символами) из файла

1

Файл a.json:

{
  "a": "b",
  "key": "graph: \"color\" = 'black' AND \"api\" = 'demo-application-v1' nodes",
  "c": "d"
}

следующий код, который я пробовал:

string_to_be_replace = "abcd"
string_to = "graph: \"color\" = 'black' AND \"api\" = 'demo-application-v1' nodes"
string_to_be_identified = "\"color\" = \'black\' AND \"api\" = \'demo-application-v1\'"
string_to_be_identified1 = '"color" = \'black\' AND "api" = \'demo-application-v1\''

print string_to_be_identified
print string_to_be_identified1
print string_to.replace(string_to_be_identified1,string_to_be_replace)
print string.replace(string_to, string_to_be_identified,string_to_be_replace)

выход:

"color" = 'black' AND "api" = 'demo-application-v1'

"color" = 'black' AND "api" = 'demo-application-v1'

graph: узлы abcd

graph: узлы abcd

Это нормально работает и заменяет строку, как ожидалось, но

это не когда я пробовал следующие подходы

Подход 1:

  1. Откройте файл в режиме чтения,

  2. получить строку за строкой и заменить строку

with open(path + '/a.json', 'r') as file:
    read_lines = file.readlines()
    for line in read_lines:
        print line.replace(string_to_be_identified,string_to_be_replace)
file.close()

выход:

{

"a": "b",

"key": "graph: \" color\"= 'black' И \" api\"= 'demo-application-v1' node",

"CD"

}

Подход 2:

  1. Откройте файл в режиме чтения,

  2. Так как файл a.json имеет данные JSON, загрузите json файл, конвертируйте json-объект в JSON-строку и затем замените его.

Код:

 with open(path + '/a.json', 'r') as file:
    loadedJson = json.load(file)
    print "z: " + str(loadedJson).replace(string_to_be_identified, string_to_be_replace)
file.close()

выход:

z: {u'a ': u'b', u'c ': u'd', u'key ': u'graph: "color" = \' black\'AND "api" =\demo- application-v1\'node'}

Подход 3:

Я предполагаю, что символ Unicode в строке JSON может создать проблему, поэтому преобразованная строка Unicode в обычную строку, а затем попыталась заменить строку

код:

def byteify(input):
    if isinstance(input, dict):
        return {byteify(key): byteify(value)
                for key, value in input.iteritems()}
    elif isinstance(input, list):
        return [byteify(element) for element in input]
    elif isinstance(input, unicode):
        return input.encode('utf-8')
    else:
        return input

with open(path + '/a.json', 'r') as file:
    loadedJson = json.load(file)
    js = byteify(loadedJson)
    print "a: " + str(js).replace(string_to_be_identified, string_to_be_replace)

выход:

a: {'a': 'b', 'c': 'd', 'key': 'graph: "color" = \' black\'AND "api" = \' demo-application-v1\'node }

  • версия для python: 2.7.15
  • используя код byteify из одного из ответов SO.
  • Файл JSON большой и не может выполнять ручной поиск и замену.
  • Нет никакой разницы в 'и' в python, который все еще используется в приведенном выше примере.
  • 0
    Любая конкретная причина, почему вы пытаетесь сделать простой поиск и замену иерархических данных, таких как JSON? Почему бы вам не проанализировать JSON, не заменить должным образом то, что вам нужно, а затем снова сериализовать его в JSON?
  • 0
    @zwer, Json слишком велик, чтобы переходить к определенным иерархиям, и хуже всего то, что String - это поле в сложном объекте, которое внутри присутствует в массиве неоднородных сложных объектов. Теперь эта строка может присутствовать как часть другого объекта в будущем, и если она не присутствует в логике синтаксического анализа, мы можем пропустить ее, поэтому подумайте о решении замены строки, которое будет работать независимо от глубины резкости в json.
Теги:
python-2.7
replace

1 ответ

1
Лучший ответ

Хотя я, конечно, не рекомендую какое - либо контекст не знает поиск и замен в виде иерархической структуры, как JSON, ваш главный вопрос заключается в том, что строка, которую вы ищете в файле JSON уцелела цитаты (буквенные \ символов), так что вы должны учитывайте их, если вы хотите выполнять поиск в текстовом режиме. Вы можете использовать либо необработанные строки, либо добавлять обратную косую черту самостоятельно, например:

str_search = r"graph: \"color\" = 'black' AND \"api\" = 'demo-application-v1'"
# or, if you prefer to manually write down the string instead of declaring it 'raw':
# str_search = "graph: \\\"color\\\" = 'black' AND \\\"api\\\" = 'demo-application-v1'"
str_replace = "abcd"

with open("/path/to/your.json", "r") as f:
    for line in f:
        print(line.replace(str_search, str_replace))

Что, для вашего JSON, даст:

{

  "a": "b",

  "key": "abcd nodes",

  "c": "d"

}

(Добавлены новые строки, добавленные print).

  • 0
    Я не знал о сырой струне, спасибо! @Zwer, это помогло :)
  • 0
    дополнительная информация о необработанной строке: stackoverflow.com/questions/2081640/…
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню