#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)