Как изменить строку в файле YAML? - PullRequest
0 голосов
/ 20 июня 2019

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

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

Возможно ли это? Я не могу понять, как заменить линию. Я знаю точный номер строки, это может помочь?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Поскольку вы знаете точный номер строки, это довольно просто - даже не имеет значения, является ли файл YAML, если вы точно знаете, что вам нужно его заменить.

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

import os
line_number = 47  # Whatever the line number you're trying to replace is
replacement_line = "Whatever string you're replacing this line with"

items = os.listdir(".")  # Gets all the files & directories in the folder containing the script

for file_name in items:  # For each of these files and directories,
    if file_name.lower().endswith(".yaml"):  # check if the file is a YAML. If it is:
        with open(file_name, "w") as file:  # Safely open the file
            data = file.read()  # Read its contents
            data[line_number] = replacement_line  # Replace the line
            file.write(data)  # And save the file

Обратите внимание, что если ваши файлы имеют формат .yml, а не .yaml, вам придется изменить это в коде.,Кроме того, если ваши файлы слишком велики, это может вызвать проблемы при загрузке каждого файла в память.

Если это не работает для вас, то в Интернете есть и другие решения, включая переполнение стека!

0 голосов
/ 20 июня 2019

Я использую библиотеку pyyaml ​​ (pip install pyyaml):

Он обрабатывает полный синтаксис YAML, как показано в следующем примере:

  • python example
import yaml

with open("data.yaml", "w+") as FILE:
    data = yaml.load(FILE)
    data.pop("token_default")
    yaml.dump(data)


  • data.yaml
token_default: &token
  token      : !!str
  type       : # var, field, list, vector
  version    : 0.1
  namespace  : cam_tokens
  properties :
    unit   : !!seq [0, 0, 0, 0, 0, 0]
    min    : !!float +inf
    max    : !!float -inf
    argPos : !!int -1
  required   :
    - unit
    - argPos

mass:
  <<: *token
  token: mass
  namespace  : cam_tokens
  properties :
    unit   : !!seq [1, 0, 0, 0, 0, 0]
  required   :
    - unit
    - argPos
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...