Документы по шаблону · Шаг 4 из 4
Имена готовых файлов
Сто договоров должны лечь в папку под понятными именами — «Договор 17 Иванов.txt». Но в таблице встречается ООО «Рога/Копыта» с косой чертой, а Ивановых трое. Windows не примет в имени файла косую черту и двоеточие, а macOS считает «Иванов.txt» и «иванов.txt» одним файлом: второй договор молча затрёт первый.
Что сделать
Придумайте каждой строке имя файла по образцу — без запрещённых знаков и без совпадений с уже выданными именами.
Что приходит
obrazec— образец имени с полями, как в шаблоне:"Договор ${nomer} ${fio}.txt"stroki— список строк таблицы, словари «столбец → значение»; все поля образца в них есть
Что вернуть
Список имён файлов — по одному на строку, в том же порядке.
Допишите функцию imena_faylov в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Программа зовёт imena_faylov один раз на все годные строки и записывает каждый документ из шага 3 под своим именем. В пробном показе она печатает эти имена, ничего не записывая.
Образец «Договор ${nomer} ${fio}.txt» и две строки — 17, Иванов и 18, ООО "Рога/Копыта" — дают «Договор 17 Иванов.txt» и «Договор 18 ООО Рога_Копыта.txt»: кавычки и косая черта в имени файла запрещены и стали подчёркиваниями.
obrazec = "Договор ${nomer} ${fio}.txt"
stroki = [{"nomer": "17", "fio": "Иванов"}, {"nomer": "18", "fio": 'ООО "Рога/Копыта"'}]
imena_faylov(obrazec, stroki)
['Договор 17 Иванов.txt', 'Договор 18 ООО _Рога_Копыта_.txt']
Для каждой строки по порядку:
- Подставить значения в образец по правилам
string.Template(какsafe_substitute): пробелы по краям значений убраны,None— как пустая строка. Обратите внимание: в$nomer_$fioпервое поле —nomer_, поэтому поля, за которыми идёт буква, цифра или_, пишут в фигурных скобках. - Каждый из знаков
\ / : * ? " < > |заменить на_. - Несколько пробелов подряд — один пробел, пробелы по краям убрать; точки и пробелы в конце имени убрать (Windows их не хранит). Ничего не осталось — имя
bez_imeni. - Совпадения. Имена сравниваются без учёта больших и маленьких букв. Если такое имя уже выдано одной из прежних строк, перед расширением дописывается
(2): «иванов (2).txt»; занято и оно —(3), и так далее. Расширение — то, что после последней точки, какsuffixуpathlib; у имени без точки оно пустое. Выданное с номером тоже занимает своё имя: если следующая строка сама даёт «а (2).txt», а оно уже выдано, она получит «а (2) (2).txt».
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.