Python заменяет строку в файле не работает - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть файл JSON с именем myBlock.json:

{
  "server": "https://abc.us",
  "name":"XYZ",
  "myData":"2019-04-08T15:43:05.810483Z",
  "someFlg":"T",
  "moreData":"k"
}

Я пытаюсь изменить это с помощью новой информации о дате и времени, чтобы

        with open("myBlock.json") as json_data:
            self.myBlockInfo = json.load(json_data)

        origData = self.myBlockInfo["myData"]
        origLine = '\"myData\":\"'+origData +'\",'

        nowData = self.timeISO8601ZuluUTC()
        newLine = '\"myData\":\"'+nowData+'\",'

        with open("myBlock.json", "r+") as fh:
            for line in fh.readlines():
                if origLine in line:
                    print ("1-->", line)
                    str.replace(line, origLine, newLine)
                    print("2-->", line)

, но не только строкато же самое, но и файл myBlock.Json остается прежним и не изменяется?

Ответы [ 3 ]

0 голосов
/ 08 апреля 2019

Вы можете редактировать файл следующим образом:

with open("myBlock.json", encoding="utf-8") as json_data:
    myBlockInfo = json.load(json_data)

origData = myBlockInfo["myData"]
origLine = '\"myData\":\"'+origData +'\",'

nowData = "asdsa"
newLine = '\"myData\":\"'+nowData+'\",'
myBlockInfo["myData"] = "sdfsd"
updated =  open("myBlock.json", "w", encoding="utf-8")
json.dump(myBlockInfo, updated)

Редактирование блока myBlockInfo["myData"] напрямую и сохранение файла с помощью json.dump.Кроме того, вы можете использовать опцию кодирования, чтобы убедиться, что обе кодировки при чтении и записи одинаковы

0 голосов
/ 08 апреля 2019

То, что вы ищете, это отступ kwarg из [Python 3]: json. dump ( obj, fp, *, skipkeys = False, sure_ascii = True, check_circular = True, allow_nan = True, cls = Нет, отступ = Нет, разделители = Нет, по умолчанию = Нет, sort_keys = False, ** кВт )

Если отступ является неотрицательным целым числом или строкой, то элементы массива JSON и члены объекта будут напечатаны с этим уровнем отступа. Уровень отступа 0, отрицательный или "" будет вставлять только новые строки. None (по умолчанию) выбирает наиболее компактное представление. Используя отступ целочисленного положительного отступа, много пробелов на уровень. Если indent является строкой (например, "\t"), эта строка используется для отступа каждого уровня.

code.py

#!/usr/bin/env python3

import sys
import json


def main(argv):
    with open("in.json") as inf:
        obj = json.load(inf)

    print("Original date:", obj["myData"])
    # Modify obj["myData"] to whatever you need (self.timeISO8601ZuluUTC())

    output_indent = int(argv[0]) if len(argv) and argv[0].isdecimal() else None
    with open("out.json", "w") as outf:
        json.dump(obj, outf, indent=output_indent)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main(sys.argv[1:])
    print("Done.")

выход

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055578224]> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> dir /b
code.py
in.json

[prompt]> type in.json
{
  "server": "https://abc.us",
  "name":"XYZ",
  "myData":"2019-04-08T15:43:05.810483Z",
  "someFlg":"T",
  "moreData":"k"
}

[prompt]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

Original date: 2019-04-08T15:43:05.810483Z
Done.

[prompt]> dir /b
code.py
in.json
out.json

[prompt]> type out.json
{"server": "https://abc.us", "name": "XYZ", "myData": "2019-04-08T15:43:05.810483Z", "someFlg": "T", "moreData": "k"}
[prompt]>
[prompt]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py 2
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

Original date: 2019-04-08T15:43:05.810483Z
Done.

[prompt]> dir /b
code.py
in.json
out.json

[prompt]> type out.json
{
  "server": "https://abc.us",
  "name": "XYZ",
  "myData": "2019-04-08T15:43:05.810483Z",
  "someFlg": "T",
  "moreData": "k"
}

Как видите, файл был переписан без необходимости изменения его необработанного (текстового) содержимого.

0 голосов
/ 08 апреля 2019

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

origLine = '"myData":"'+origData +'",'

Тогда более простой способ сделать замену - заменить содержимое файла целиком, а не читать построчно:

with open("myBlock.json", "r") as fh:
    oldcontent = fh.read()
    if origLine in oldcontent:
        print("found!!")
    newcontent = oldcontent.replace(origLine, newLine)
with open("newfile.json", "w") as fh:
    fh.write(newcontent)

Но это не гарантируется! Я поместил if в первый блок with, чтобы помочь вам проверить, действительно ли существует то, что вы ожидаете. Скорее всего, входной JSON может содержать пробелы вокруг двоеточия, например "myData": "foobar", или даже новые строки рядом с двоеточием. Это все законные JSON. Вот почему кто-то в комментарии предложил вам прочитать JSON, изменить его и записать обратно JSON.

Если вы думаете, что возвращение JSON испортит формат, попробуйте

 newcontent = json.dumps(modified_data, indent=4)

indent=4 "красиво напечатает" ваш JSON, вставив соответствующие отступы, вероятно, сохранит некоторое форматирование, которое вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...