【问题标题】:Python String replacement in a file each time gives different result每次文件中的Python字符串替换都会产生不同的结果
【发布时间】:2018-07-01 10:03:55
【问题描述】:

我有一个 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)

以下是builtAdresbuiltYesterdayAdres 的一些示例:

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

我在我的数据上运行它,但每次都会产生许多不同的输出。请检查下面的屏幕截图,因为我不知道我还能说些什么。

这是相同的代码,我每次都运行相同的东西,但每次都会产生不同的结果。

这是原始 JSON 文件:

它应该做的是针对01 Temmuz 2018 Pazar 测试整个文件,如果发现只是用字符串Isim 替换它而不触及其他任何东西。在第二次运行时检查是否有 30 Haziran 2018 Cumartesi 并将它们替换为字符串 Isim

这是什么原因造成的?

重新测试的示例文件:

pastebin - veri3.json

pastebin - code.py

【问题讨论】:

  • 我在replacements1 部分之前添加了这两行。 replacements1 = collections.OrderedDict() replacements3 = collections.OrderedDict() 仍然有些字段有时会消失。 (就像01 Temmuz 2018 Pazar.2 部分应该说Isim.2 但整个部分又消失了)
  • 能否请您创建一个更小的测试用例来揭示问题?如果没有您的 JSON 文件,我们将无法重现该问题。
  • @user8035311 我将发布今天的完整代码和json文件,编辑问题。编辑:我已经添加了 json 文件和我正在尝试的 python 代码。

标签: json string python-3.x replace


【解决方案1】:

我认为你只有一个问题:你试图在同一个对象中多次使用“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 行以指定“utf-8”作为输出文件的编码:

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

【讨论】:

  • 这确实解决了问题,我没有意识到我试图将所有重命名为相同。 :(我使用firefox quantom查看。它自动将json文件美化为可读格式。非常感谢。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多