Module (20%)
Section (25%)

Имена файлов: продолжение

Предположим, Вас интересует определенный файл, расположенный в каталоге dir с именем file.

Предположим также, что Вы хотите присвоить строку, содержащую имя файла.

В системах Unix/Linux это может выглядеть следующим образом:

name = "/dir/file"

Но если Вы попытаетесь закодировать его для системы Windows:

name = "\dir\file"

Вы получите неприятный сюрприз: либо Python выдаст ошибку, либо программа будет вести себя странно, как будто имя файла каким-то образом искажено.

На самом деле это совсем не странно, но вполне очевидно и естественно. Python использует \ в качестве escape-символа (например, \n).

Это означает, что имена файлов Windows должны быть записаны следующим образом:

name = "\\dir\\file"

К счастью, есть и еще одно решение. Python достаточно умен, чтобы иметь возможность преобразовывать косые черты в обратную косую черту каждый раз, когда обнаруживает, что это требуется для ОС.

Это означает, что любые следующие присваивания:

name = "/dir/file" name = "c:/dir/file"

будут работать и с Windows.

Любая программа, написанная на Python (и не только на Python, поскольку это соглашение применяется практически ко всем языкам программирования), не взаимодействует с файлами напрямую, а через некоторые абстрактные объекты, которые по-разному называются в разных языках или средах - наиболее используемые термины - это дескрипторы или потоки (здесь мы будем использовать их как синонимы).

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

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




Accessing files – a tree structure concept


Операции, выполняемые с абстрактным потоком, отражают действия, связанные с физическим файлом.

Чтобы связать поток с файлом, необходимо выполнить явную операцию.

 

Операция соединения потока с файлом называется открытием файла, а отключение этой ссылки называется закрытием файла.

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

Эта свобода, конечно, ограничена физическими характеристиками файла и способом его открытия.

 

Скажем еще раз, что открытие потока может быть неудачным, и это может произойти по нескольким причинам: наиболее распространенной является отсутствие файла с указанным именем.

Может также случиться, что физический файл существует, но программе не разрешено его открывать. Существует также риск того, что программа открыла слишком много потоков, и конкретная операционная система может не допустить одновременного открытия более чем n файлов (например, 200).

Хорошо написанная программа должна обнаруживать эти неудачные открытия и реагировать соответствующим образом.