Замена Python String в файле каждый раз дает разный результат - PullRequest
0 голосов
/ 01 июля 2018

У меня есть файл JSON, и я хочу сделать в нем некоторые замены. Я сделал код, он работает, но он шаткий.

Это место, где производится замена.

replacements1 = {builtTelefon:'Isim', builtIlce:'Isim', builtAdres:'Isim', builtIsim:'Isim'}
replacements3 = {builtYesterdayTelefon:'Isim', builtYesterdayIlce:'Isim', builtYesterdayAdres:'Isim', builtYesterdayIsim:'Isim'}

with open('veri3.json', encoding='utf-8') as infile, open('veri2.json', 'w') as outfile:
for line in infile:
    for src, target in replacements1.items():
        line = line.replace(src, target)
    for src, target in replacements3.items():
        line = line.replace(src, target)
    outfile.write(line)

Вот несколько примеров того, как builtAdres и builtYesterdayAdres выглядит:

01 Temmuz 2018 Pazar.1
30 Haziran 2018 Cumartesi.1

Я запускаю это на своих данных, но каждый раз это приводит ко многим различным выводам. Пожалуйста, проверьте скриншот ниже, потому что я не знаю, как еще я могу рассказать об этом.

Это один и тот же код, и я каждый раз выполняю одно и то же, но каждый раз это приводит к разным результатам.

imgur mirror of the problem

Вот оригинальный файл JSON:

imgur mirror of original file

Что он должен сделать, это проверить весь файл на 01 Temmuz 2018 Pazar и, если он найдет, просто заменить его на строку Isim, не касаясь ничего другого. При втором запуске проверяется, является ли что-либо 30 Haziran 2018 Cumartesi и заменяет их также строкой Isim.

Что вызывает это?

Файлы примеров для повторного тестирования:

pastebin - veri3.json

pastebin - code.py

1 Ответ

0 голосов
/ 01 июля 2018

Я думаю, у вас есть только одна проблема: вы пытаетесь использовать «Isim» в качестве имени ключа несколько раз в одном и том же объекте, и это приведет к ошибке JSON.
Причина, по которой вы можете «получать разные результаты», может быть связана с клиентом, который вы используете для отображения JSON. Я думаю, что если вы посмотрите на необработанные данные, JSON должен был быть полностью изменен (я запустил ваш скрипт, и он, похоже, изменился). Однако клиент не очень хорошо справится с повторяющимся ключом и отобразит все объекты так хорошо, как может.
На самом деле, я не уверен, как вы получаете «Isim.1», «Isim.2» в качестве ключей, поскольку вы фактически используете «Isim» для всех. Клиент должен пытаться справиться с двуличностью там.

Попробуйте этот код, где я использую "Isim.1", "Isim.2" и т. Д.:

replacements1 = {builtTelefon:'Isim.3', builtIlce:'Isim.2', builtAdres:'Isim.1', builtIsim:'Isim'}
replacements3 = {builtYesterdayTelefon:'Isim.3', builtYesterdayIlce:'Isim.2', builtYesterdayAdres:'Isim.1', builtYesterdayIsim:'Isim'}

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

Да и PS: чтобы использовать ваш код с моей локалью, мне пришлось изменить строку 124, указав в качестве кодировки для outfile 'utf-8':

with open('veri3.json', encoding='utf-8') as infile, open('veri2.json', 'w', encoding='utf-8') as outfile:
...