Задания 10 и 11: файловая система, пути и маски имён
Учимся читать пути и подбирать файлы по маскам с * и ? — это задания №10 и №11.
Маска имени файла — это шаблон с подстановочными символами
*и?, которому должны соответствовать имена искомых файлов.
Что проверяют задания 10 и 11
Задание 10 (часть 1) — про пути и маски: какие файлы подойдут под маску, или какой путь ведёт к файлу. Задание 11 (часть 2, на компьютере) — реальный поиск слова/фрагмента в файлах предложенного каталога. Теория масок одна и та же, поэтому разбираем вместе.
Пути в файловой системе
Файлы хранятся в папках (каталогах), вложенных друг в друга, как матрёшки. Путь — это маршрут к файлу через папки, разделённые символом \ (Windows) или /.
C:\Школа\Информатика\ОГЭ\задание.txt
| | | |
диск папка папка файл
В заданиях часто дают дерево каталогов и спрашивают полный путь к файлу — нужно просто пройти от корня до файла, выписывая все папки по дороге.
Маски: символы * и ?
| Символ | Что заменяет |
* | любую последовательность символов (в том числе пустую) |
? | ровно один любой символ |
Имя файла обычно состоит из имени и расширения, разделённых точкой: otchet.txt. Маска проверяется отдельно для имени и расширения.
Метод: проверяем имя посимвольно
Какие файлы подходят под маску *.txt? Это «любое имя, расширение строго txt». Проверим на списке:
import fnmatch
files = ["data.txt", "data1.txt", "report.doc", "a.txt", "ab.docx", "note.text"]
mask = "*.txt"
podhodyat = [f for f in files if fnmatch.fnmatch(f, mask)]
print("Под *.txt:", podhodyat)
Вывод:
Под *.txt: ['data.txt', 'data1.txt', 'a.txt']
Заметьте: note.text не подошёл — расширение text, а не txt. Маска *.txt требует ровно три буквы после точки. А report.doc и ab.docx отсеялись по расширению.
Маска с символом ?
Какие файлы подходят под ?ata?.txt? Это «один символ + ata + один символ, расширение txt». То есть имя ровно из 5 букв вида «_ata_».
import fnmatch
files = ["data.txt", "data1.txt", "report.doc", "a.txt", "ab.docx", "note.text"]
mask2 = "?ata?.txt"
print("Под ?ata?.txt:", [f for f in files if fnmatch.fnmatch(f, mask2)])
Вывод:
Под ?ata?.txt: ['data1.txt']
Подошёл только data1.txt: «d» + «ata» + «1» = пять символов перед .txt. А data.txt не подошёл — после «ata» нет ещё одного символа (там сразу точка), а ? требует ровно один символ.
Как рассуждать на экзамене без компьютера
- Разбейте маску и имя на «имя» и «расширение» по последней точке.
- Сопоставляйте слева направо:
?«съедает» ровно один символ,*— сколько нужно. - Если в конце маски остались символы, а имя кончилось (или наоборот) — не подходит.
Полезная проверка: * может быть и пустым. Поэтому под маску a*.txt подходит и a.txt (звёздочка — пустая), и abc.txt.
Задание 11 на компьютере
Здесь вам дают папку с файлами и просят найти, в скольких файлах встречается слово, или какой файл его содержит. На практике используют встроенный поиск операционной системы или функцию «Найти» в текстовом редакторе. Идея та же: точное совпадение строки, аккуратность с регистром и пробелами.
Типичные ошибки
- Считают, что
?заменяет «ноль или один» символ (на самом деле ровно один). - Забывают, что
*может быть пустым. - Сравнивают расширения небрежно:
txt≠text. - Путают, что проверяется отдельно имя и отдельно расширение.
Итог
- Путь — маршрут через папки от корня к файлу.
*— любая (в т.ч. пустая) последовательность;?— ровно один символ.- Имя и расширение проверяются отдельно по точке.
- Сопоставляйте маску с именем слева направо, аккуратно с длиной.