Как изменить значение строки в файле внутри цикла без добавления новых строк с помощью Python?

#python #json

#python #json

Вопрос:

Я знаю, что заголовок может быть не очень понятным, поэтому вот моя проблема ниже: я довольно новичок в Python, у меня есть файл yaml, который содержит много вариантов этого блока кода:

 x-amazon-apigateway-integration:
      responses:
        default:
          statusCode: "200"
      uri: addProfile_uri
      passthroughBehavior: when_no_match
      httpMethod: POST
      cacheNamespace: roq9wj
      cacheKeyParameters:
      - method.request.path.proxy
      type: aws_proxy

x-amazon-apigateway-integration:
      responses:
        default:
          statusCode: "200"
      uri: deleteProfile_uri
      passthroughBehavior: when_no_match
      httpMethod: POST
      cacheNamespace: roq9wj
      cacheKeyParameters:
      - method.request.path.proxy
      type: aws_proxy
  

И файл json, содержащий это:

 [
  {
    "function_variable_uri_name": "addProfile_uri",
    "uri": "arn:aws:apigateway:XXXXXX"
  },
  {
    "function_variable_uri_name": "deleteProfile_uri",
    "uri": "arn:aws:apigateway:XXXXXX"
  },
  {
    "function_variable_uri_name": "getAllProfile_uri",
    "uri": "arn:aws:apigateway:XXXXXX"
  },
  {
    "function_variable_uri_name": "getProfile_uri",
    "uri": "arn:aws:apigateway:XXXXXX"
  },
  {
    "function_variable_uri_name": "updateProfile_uri",
    "uri": "arn:aws:apigateway:XXXXXX"
  }
]
  

Итак, в моем коде на Python я попытался выполнить цикл внутри файла JSON, извлечь оба uri и function_variable_uri_name значения. Идея заключалась в том, чтобы выполнить цикл внутри файла yaml и выполнить поиск каждого вхождения function_variable_uri_name (пример: deleteProfile_uri ) и изменить его на uri значение arn:aws:apigateway:XXXXXX .

 import json

flambda = open('uri_var.json')
lambda_inputs = json.load(flambda)

fout = open("profile_modif.yaml", "wt")

with open('profile.yaml', 'r ') as file:
    for each in lambda_inputs:
        variable_uri_name = each['function_variable_uri_name']
        uri = each['uri']
        for line in file:
            fout.write(line.replace(variable_uri_name, uri))
                
file.close()
  

Мой приведенный выше код Python изменяет только значение первого вхождения variable_uri_name внутри YAML, которое addProfile_uri равно значению uri и не изменяет deleteProfile_uri , и мне нужен цикл for внутри моего файла JSON, потому что у меня есть много входных данных для обработки.

Обновление: Вот простая печать для обоих значений function_variable_uri_name и uri из моего файла json:

 addProfile_uri
arn:aws:apigateway:XXXXXX
deleteProfile_uri
arn:aws:apigateway:XXXXXX
getAllProfile_uri
arn:aws:apigateway:XXXXXX
getProfile_uri
arn:aws:apigateway:XXXXXX
updateProfile_uri
arn:aws:apigateway:XXXXXX
  

Какие-либо решения, пожалуйста? Заранее всем вам спасибо.

Комментарии:

1. Я думаю, вам следует сначала очистить свой файл json, чтобы иметь удобную безупречную итерацию. На самом деле ваши данные представляют собой список с вложенными элементами в фигурных скобках. тогда метод readlines() мог бы выполнить эту работу.

2. @Cyber-Tech Спасибо за ваш ответ, но извините, я не понял вашу точку зрения. На самом деле я получаю все нужные мне значения из моего файла json, используя: для каждого в lambda_inputs. Я имею в виду, я действительно не понимаю, в чем именно проблема с файлом json.

3. Я вижу 2 вертикальные точки перед последней строкой в json, какова их функция?

4. @Cyber-Tech Извините, я не обратил на это внимания, это просто опечатка. Я обновил его, спасибо

Ответ №1:

Измените то, как вы думаете о работе. Вы хотите работать один раз с каждой строкой и выполнять несколько операций проверки и замены в каждой строке. Другими словами, вы хотите сначала выполнить итерацию по файлу, а затем выполнить итерацию по переменным замены во вложенной операции над файловой операцией:

 import json

with open('uri_var.json') as flambda:
    lambda_inputs = json.load(flambda)

with open("profile_modif.yaml", "wt") as fout:
    with open('profile.yaml', 'r ') as file:
        for line in file:
            for item in lambda_inputs:
                line = line.replace(item['function_variable_uri_name'], item['uri'])
            fout.write(line)