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

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 nodes
graph: abcd nodes

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

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

Подход 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' AND \"api\" ='demo-application-v1' node",
  "c": "d"
}

Подход 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, который все еще использовался в приведенном выше примере.

Какая-либо конкретная причина, по которой вы пытаетесь выполнить простой поиск и замену иерархических данных, таких как JSON? Почему бы вам не проанализировать JSON, правильно заменить то, что вам нужно, а затем снова сериализовать его в JSON?

zwer 20.09.2018 14:19

@zwer, Json слишком велик, чтобы перейти к конкретным иерархиям, и хуже всего то, что String - это поле в сложном объекте, которое присутствует в массиве неоднородных сложных объектов. Теперь эта строка может присутствовать как часть другого объекта в будущем, и если она не присутствует в логике синтаксического анализа, мы можем ее пропустить, поэтому подумайте о решении замены строки, которое будет работать независимо от глубины резкости в json.

dkb 20.09.2018 14:24
Почему в 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
2
1 286
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).

Я не знал о сырой струне, спасибо! @Zwer, это помогло :)

dkb 20.09.2018 15:15

дополнительная информация о необработанной строке: stackoverflow.com/questions/2081640/…

dkb 20.09.2018 15:20

Дополнительная информация: Операция с необработанной строкой отличается от обычной конкатенации строк, цвет - это переменная, определяемая пользователем: например, r"AND color = '" + color + "' AND \"api\" тогда лучше тебе делать r"AND color = '" + color + r"' AND \"api\"

dkb 27.09.2018 11:57

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