Имена файлов: продолжение
Предположим, Вас интересует определенный файл, расположенный в каталоге 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, поскольку это соглашение применяется практически ко всем языкам программирования), не взаимодействует с файлами напрямую, а через некоторые абстрактные объекты, которые по-разному называются в разных языках или средах - наиболее используемые термины - это дескрипторы или потоки (здесь мы будем использовать их как синонимы).
Программист, имеющий более или менее богатый набор функций/методов, может выполнять определенные операции над потоком, которые влияют на реальные файлы, используя механизмы, содержащиеся в ядре операционной системы.
Таким образом, Вы можете реализовать процесс доступа к любому файлу, даже если имя файла неизвестно на момент написания программы.
Операции, выполняемые с абстрактным потоком, отражают действия, связанные с физическим файлом.
Чтобы связать поток с файлом, необходимо выполнить явную операцию.
Операция соединения потока с файлом называется открытием файла, а отключение этой ссылки называется закрытием файла.
Следовательно, вывод заключается в том, что самая первая операция, выполняемая в потоке, всегда open
, а последняя - close
. По сути, программа может свободно управлять потоком между этими двумя событиями и обрабатывать связанный файл.
Эта свобода, конечно, ограничена физическими характеристиками файла и способом его открытия.
Скажем еще раз, что открытие потока может быть неудачным, и это может произойти по нескольким причинам: наиболее распространенной является отсутствие файла с указанным именем.
Может также случиться, что физический файл существует, но программе не разрешено его открывать. Существует также риск того, что программа открыла слишком много потоков, и конкретная операционная система может не допустить одновременного открытия более чем n файлов (например, 200). р>
Хорошо написанная программа должна обнаруживать эти неудачные открытия и реагировать соответствующим образом.