Одной из причин, по которым мне нравится программирование, так это то, что он позволяет мне автоматизировать небольшие и раздражающие вещи, которые в противном случае потребуют бы куча ручной работы.
Вчера я загрузил набор файлов, которые пришли в следующую структуру каталогов внутри ZIP-файла:
- Main Folder - Theme A (1) - FileA.pdf - FileA.txt - FileA.jpg - Theme B (2) - FileB.pdf - FileB.txt - FileB.jpg - Theme C (3) ...
Для моего использования в случае случая использования я был заинтересован только в файлах PDF и хотел записать заказ этих файлов, которые были написаны в скобках в папке. Я мог бы вручную перемещать их все в новую папку в искателе, но, поскольку из них было несколько десятка, я открыл мой редактор и начал писать Питона.
import os import re import shutil NUMBER_PATTERN = re.compile(r'\((\d+)\)') for directory, _, files in os.walk('.'): if directory == './Output': continue for filename in files: if not filename.endswith('.pdf'): continue episode_number = NUMBER_PATTERN.findall(directory)[0] path = os.path.join(directory, filename) new_filename = f'{episode_number:0>2} - {filename}' new_path = os.path.join('Output', new_filename) print(f'Copying {path} to {new_path}') shutil.copyfile(path, new_path)
Это один запуск скрипта, который опирается на очень специфическую структуру именования и файлов, а также наличие выходной папки. Так что, если что-то не в порядке, это просто ломается.
Это означает, что это не очень удобно, и он, вероятно, не самый лучший, ни самый Pythonic код, который я мог написать. Но поскольку это скрипт, предназначенный для бега раз в этой особой ситуации, я могу восстановиться от ситуаций ошибок вручную.
И это красота этого. Это не должно быть хорошим кодом, он просто должен работать один раз. Это экономит мне много раздражающих ручных копирований и переименования файлов.
В отличие от поиска пищевания хорошего, ремонторуемого и устойчивого к ошибкам кода на работе для производства, эти скрипты позволяют мне получить небольшие победы, просто соскребавшими код вместе.
редактировать Я хочу выделить этот красивый сценарий Bash, который @teroyks Создано В комментариях :
find . -iname "*.pdf" | while read F; do FILE=$(basename "$F"); NR=$(printf "%02d" "$(echo "$F" | sed "s/.*(\(.*\)).*/\1/")"); cp -v "$F" "./Output/$NR - $FILE"; done
Редактировать2 @teroyks Также предоставил нам пример в раковине рыбы:
for f in (find . -iname "*.pdf") set file (basename $f) set number (string match -r "\((.*)\)" $f)[2] set number (printf "%02d" $number) cp -v $f "./Output/$number - $file" end
Оригинал: “https://dev.to/hamatti/i-love-writing-scripts-to-solve-small-problems-462m”