Задания 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» нет ещё одного символа (там сразу точка), а ? требует ровно один символ.

Как рассуждать на экзамене без компьютера

  1. Разбейте маску и имя на «имя» и «расширение» по последней точке.
  2. Сопоставляйте слева направо: ? «съедает» ровно один символ, * — сколько нужно.
  3. Если в конце маски остались символы, а имя кончилось (или наоборот) — не подходит.

Полезная проверка: * может быть и пустым. Поэтому под маску a*.txt подходит и a.txt (звёздочка — пустая), и abc.txt.

Задание 11 на компьютере

Здесь вам дают папку с файлами и просят найти, в скольких файлах встречается слово, или какой файл его содержит. На практике используют встроенный поиск операционной системы или функцию «Найти» в текстовом редакторе. Идея та же: точное совпадение строки, аккуратность с регистром и пробелами.

Типичные ошибки

  • Считают, что ? заменяет «ноль или один» символ (на самом деле ровно один).
  • Забывают, что * может быть пустым.
  • Сравнивают расширения небрежно: txttext.
  • Путают, что проверяется отдельно имя и отдельно расширение.

Итог

  • Путь — маршрут через папки от корня к файлу.
  • * — любая (в т.ч. пустая) последовательность; ? — ровно один символ.
  • Имя и расширение проверяются отдельно по точке.
  • Сопоставляйте маску с именем слева направо, аккуратно с длиной.
Проверьте себя
1. Что заменяет символ ? в маске имени файла?
AЛюбую последовательность символов
BРовно один любой символ
CТолько цифры
DТочку в имени
2. Подходит ли файл note.text под маску *.txt?
AДа, ведь есть txt
BНет, расширение text, а не txt
CДа, * заменяет всё
DПодходит только в Windows
3. Подходит ли файл a.txt под маску a*.txt?
AНет, после a нет символов
BДа, * может быть пустым
CТолько если добавить ?
DНет, нужно минимум одна буква
4. Из чего состоит полный путь к файлу?
AТолько из имени файла
BИз маршрута через папки от корня до файла
CИз расширения и размера
DИз маски и точки
Поддержать проект