Yaml объединяются в Python

Часто, когда я пишу умеренно сложный сценарий - или сценарий, который должен повторяться правильно большое количество раз - я не пишу сценарий, который выполняет работу, я пишу сценарий, который выводит последовательность команд, которые сделают работу. Таким образом, я могу потратить некоторое время, чтобы просмотреть вывод скрипта и определить, выглядит ли последовательность команд, сгенерированная им, разумной. Так как это всего лишь команды оболочки, я также могу включить комментарии в вывод скрипта, чтобы «показать мою работу» и подтвердить, что действия, выполняемые скриптом, основаны на звуковой логике.

Решение Индера действительно умно, достаточно подстановочного знака. Пока он писал это, я писал:

Пусть каталоги dirN уже созданы, таблица классов находится в файле class, а список файлов, которые нужно переместить в файл files. [ 117]

#!/usr/bin/env bash

# read in the class table:

eval $(
tail +2 classes |\
while read PREF CLASS
do
        echo X$PREF=$CLASS\;
done
)

# now iterate through the filenames:

while read FILE
do
        GROUP=${FILE%%-*}
        CLASS="X${GROUP}"
        printf '# file "%s" is group "%s", which is class "%s"\n' "$FILE" "$GROUP" "${!CLASS}"
        printf 'mv -vi "%s" "dir%s"\n' "$FILE" "${!CLASS}"
done < files

Выходные данные этого сценария:

$ ./foo.sh
# file "abc-1.jpg" is group "abc", which is class "0"
mv -vi "abc-1.jpg" "dir0"
# file "abc-2.jpg" is group "abc", which is class "0"
mv -vi "abc-2.jpg" "dir0"
# file "def-1.jpg" is group "def", which is class "0"
mv -vi "def-1.jpg" "dir0"
# file "abg-1.jpg" is group "abg", which is class "2"
mv -vi "abg-1.jpg" "dir2"
# file "abg-2.jpg" is group "abg", which is class "2"
mv -vi "abg-2.jpg" "dir2"
# file "abg-3.jpg" is group "abg", which is class "2"
mv -vi "abg-3.jpg" "dir2"
# file "poc-1.jpg" is group "poc", which is class "1"
mv -vi "poc-1.jpg" "dir1"
# file "qrs-1.jpg" is group "qrs", which is class "4"
mv -vi "qrs-1.jpg" "dir4"

Если эти команды выглядят нормально, запустите сценарий снова и направьте вывод в bash:

$ ./foo.sh  | bash
abc-1.jpg -> dir0/abc-1.jpg
abc-2.jpg -> dir0/abc-2.jpg
def-1.jpg -> dir0/def-1.jpg
abg-1.jpg -> dir2/abg-1.jpg
abg-2.jpg -> dir2/abg-2.jpg
abg-3.jpg -> dir2/abg-3.jpg
poc-1.jpg -> dir1/poc-1.jpg
qrs-1.jpg -> dir4/qrs-1.jpg

Сборка «мета-сценарий» таким образом позволяет проверять свою работу перед выполнением, возможно, не совсем корректного действия тысячи раз. Однако, это может быть непрактичным в тех случаях, когда существует не тысячи, а миллионы или миллиарды итераций. Тем не менее, если кто-то использует эту технику на небольшой подвыборке набора данных мамонта, это может быть очень полезным методом для отладки логики вашего скрипта без каких-либо недостатков или ошибок в вашем скрипте. Просто внимательно прочитайте вывод сценария, прежде чем направлять его в оболочку live bash.

13
задан 5 May 2009 в 03:31
поделиться

1 ответ

Вы можете использовать PyYAML для анализа файлов, а затем следующую функцию для объединения двух деревьев:

def merge(user, default):
    if isinstance(user,dict) and isinstance(default,dict):
        for k,v in default.iteritems():
            if k not in user:
                user[k] = v
            else:
                user[k] = merge(user[k],v)
    return user

При желании вы можете сделать глубокую копию дерева пользователей перед вызовом этой функции.

21
ответ дан 1 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: