Как указать путь к файлу в python

Обновлено: 01.07.2024

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

Файловые системы

Диск вашего компьютера организован в виде иерархической структуры файлов и каталогов.

  • файлы -- они содержат информацию. Примеры включают файлы csv или файлы python.
  • каталоги. Содержат файлы и каталоги внутри.

Ваша файловая система начинается с корневого каталога, обозначенного косой чертой / в Unux и буквой диска C:/ в Windows.

Абсолютные и относительные пути к файлам

Абсолютные пути к файлам обозначаются косой чертой в начале или меткой диска. Например, /home/example_user/example_directory или C:/system32/cmd.exe. Абсолютный путь к файлу описывает, как получить доступ к данному файлу или каталогу, начиная с корня файловой системы. Путь к файлу также называется путь.

Относительные пути к файлам обозначаются отсутствием ведущей косой черты. Например, example_directory. Относительный путь к файлу интерпретируется с точки зрения вашего текущего рабочего каталога. Если вы используете относительный путь к файлу из неправильного каталога, то путь будет указывать на файл, отличный от предполагаемого, или он вообще не будет указывать на файл.

В некотором смысле всякий раз, когда вы используете относительный путь к файлу, он объединяется с вашим текущим каталогом для создания абсолютного пути к файлу. То есть, если мой текущий рабочий каталог — /home/example_user, и я использую относительный путь к файлу example_directory/example_python_program, то это эквивалентно использованию абсолютного пути к файлу < tt>/home/example_user/example_directory/example_file_program.

В следующем примере использования оболочки командной строки Unix текущим рабочим каталогом изначально является /home/example_user/example_directory. Существует программа под названием example_python_program, которая печатает «это пример программы на Python». Сначала на программу можно ссылаться по относительному пути к файлу example_python_program. После изменения каталога на /home/example_user относительный путь к файлу для доступа к программе становится example_directory/example_python_program. Обратите внимание, что $ символизирует подсказку, которую пользователь может ввести.

os.getcwd

Когда вы запускаете программу на Python, ее текущий рабочий каталог инициализируется тем, что было вашим текущим рабочим каталогом, когда вы запускали программу. Его можно получить с помощью функции os.getcwd. Рассмотрим следующую программу: cwd_printer.py.

В следующем примере использования оболочки командной строки показано, как устанавливается текущий рабочий каталог Python.

В Windows полный путь к каталогу начинается с буквы диска (C:, D: и т. д.). В Linux и OS-X он начинается с «/», что называется root. Каталоги разделяются косой чертой «/». Вы можете найти полный путь к каталогу и имя файла через его «Свойства». Посмотрите, как это делается, в этом FAQ.

Ссылка на файл в Windows

  • Python позволяет использовать косую черту "/" в стиле OS-X/Linux даже в Windows. Поэтому вы можете ссылаться на файл как 'C:/Users/narae/Desktop/alice.txt'. РЕКОМЕНДУЕТСЯ.
  • Если вы используете обратную косую черту, так как это специальный символ в Python, вы должны помнить об экранировании каждого экземпляра: 'C:\\Users\\narae\\Desktop\\alice.txt'< /li>
  • Кроме того, вы можете поставить перед всей строкой имени файла маркер необработанной строки "r": r'C:\Users\narae\Desktop\alice.txt'. Таким образом, все в строке интерпретируется как буквальный символ, и вам не нужно экранировать каждую обратную косую черту.

Сочетания имен файлов и CWD (текущий рабочий каталог)

Таким образом, использование полного пути к каталогу и имени файла всегда работает; вы должны использовать этот метод. Однако вы могли видеть файлы, называемые только по имени, например, 'alice.txt' в Python. Как это делается?

Концепция текущего рабочего каталога (CWD) здесь имеет решающее значение. Вы можете думать об этом как о папке, в которой в данный момент работает ваш Python. До сих пор мы использовали абсолютный путь, который начинается с самого верхнего каталога. Но если ваша ссылка на файл не начинается сверху (например, 'alice.txt', 'ling1330/alice.txt'), Python предполагает, что она начинается в CWD ("относительный путь").

    В сценарии Python:
    Когда вы выполняете свой сценарий, ваш CWD устанавливается в каталог, где находится ваш сценарий. Таким образом, вы можете обращаться к файлу в скрипте по его имени только при условии, что файл и скрипт находятся в одном каталоге. Пример:

  1. Измените CWD на каталог файла или
  2. Скопируйте или переместите файл на CWD. (Не рекомендуется, так как CWD вашей оболочки может измениться.)

Поиск и изменение CWD

Исходный код: Lib/posixpath.py (для POSIX) и Lib/ntpath.py (для Windows NT).

Этот модуль реализует некоторые полезные функции для путей. Для чтения или записи файлов см. open() , а для доступа к файловой системе см. модуль os. Параметры пути могут передаваться как строки или байты. Приложениям рекомендуется представлять имена файлов в виде строк символов (Unicode). К сожалению, некоторые имена файлов не могут быть представлены в виде строк в Unix, поэтому приложения, которым необходимо поддерживать произвольные имена файлов в Unix, должны использовать объекты bytes для представления имен путей. И наоборот, использование объектов bytes не может представлять все имена файлов в Windows (в стандартной кодировке mbcs), поэтому приложения Windows должны использовать строковые объекты для доступа ко всем файлам.

В отличие от оболочки unix, Python не выполняет никаких автоматических расширений пути. Такие функции, как expanduser() и expandvars(), могут быть вызваны явно, когда приложению требуется расширение пути, подобное оболочке. (См. также модуль glob.)

Модуль pathlib предлагает высокоуровневые объекты пути.

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

Поскольку разные операционные системы используют разные соглашения об именах путей, в стандартной библиотеке есть несколько версий этого модуля. Модуль os.path всегда является модулем пути, подходящим для операционной системы, в которой работает Python, и поэтому может использоваться для локальных путей. Однако вы также можете импортировать и использовать отдельные модули, если хотите управлять путем, который всегда находится в одном из различных форматов. Все они имеют одинаковый интерфейс:

posixpath для путей в стиле UNIX

ntpath для путей Windows

Изменено в версии 3.8. Уровень ОС.

Возвращает нормализованную абсолютизированную версию пути path. На большинстве платформ это эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)) .

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает базовое имя пути path. Это второй элемент пары, возвращаемый путем передачи path в функцию split() . Обратите внимание, что результат этой функции отличается от программы базового имени Unix; где basename для '/foo/bar/' возвращает 'bar' , функция basename() возвращает пустую строку ( '' ).

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает самый длинный общий вложенный путь каждого имени пути в последовательности paths. Вызовите ValueError, если paths содержит как абсолютные, так и относительные пути, paths находятся на разных дисках или если paths пуст. В отличие от commonprefix(), возвращает правильный путь.

Новое в версии 3.5.

Изменено в версии 3.6: принимает последовательность объектов, подобных пути .

Возвращает самый длинный префикс пути (взятый посимвольно), который является префиксом всех путей в списке. Если список пуст, вернуть пустую строку ( '' ).

Эта функция может возвращать недопустимые пути, поскольку она работает с символами за раз. Чтобы получить правильный путь, см. commonpath() .

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает имя каталога пути путь. Это первый элемент пары, возвращаемый путем передачи path в функцию split() .

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если путь указывает на существующий путь или дескриптор открытого файла. Возвращает False для неработающих символических ссылок. На некоторых платформах эта функция может возвращать значение False, если не предоставлено разрешение на выполнение os.stat() для запрошенного файла, даже если путь физически существует.

Изменено в версии 3.3: path теперь может быть целым числом: True возвращается, если это дескриптор открытого файла, False в противном случае.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если путь указывает на существующий путь. Возвращает True для неработающих символических ссылок. Эквивалент exists() на платформах, где отсутствует os.lstat() .

Изменено в версии 3.6: принимает объект, подобный пути .

В Unix и Windows верните аргумент с начальным компонентом ~ или ~user, замененным домашним каталогом этого пользователя.

В Unix начальный символ ~ заменяется переменной окружения HOME, если она установлена; в противном случае домашний каталог текущего пользователя ищется в каталоге паролей с помощью встроенного модуля pwd. Исходный ~пользователь ищется непосредственно в каталоге паролей.

В Windows будет использоваться USERPROFILE, если он установлен, в противном случае будет использоваться комбинация HOMEPATH и HOMEDRIVE.Начальный ~user обрабатывается путем проверки того, что последний компонент каталога домашнего каталога текущего пользователя соответствует USERNAME , и заменяет его, если это так.

Если раскрытие завершается ошибкой или если путь не начинается с тильды, путь возвращается без изменений.

Изменено в версии 3.6: принимает объект, подобный пути .

Изменено в версии 3.8: больше не использует HOME в Windows.

Возвращает аргумент с развернутыми переменными среды. Подстроки вида $name или $ заменяются значением переменной среды name. Неверные имена переменных и ссылки на несуществующие переменные остаются без изменений.

В Windows поддерживаются расширения %name% в дополнение к $name и $ .

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает время последнего доступа к path. Возвращаемое значение представляет собой число с плавающей запятой, указывающее количество секунд, прошедших с начала эпохи (см. модуль времени). Поднимите OSError, если файл не существует или недоступен.

os.path. getmtime ( путь ) ¶

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

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает ctime системы, которое в некоторых системах (например, Unix) является временем последнего изменения метаданных, а в других (например, Windows) — временем создания path. Возвращаемое значение — это число, указывающее количество секунд, прошедших с начала эпохи (см. модуль времени). Поднимите OSError, если файл не существует или недоступен.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает размер path в байтах. Поднимите OSError, если файл не существует или недоступен.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает True, если path является абсолютным путем. В Unix это означает, что он начинается с косой черты, а в Windows — с (обратной) косой черты после отсечения потенциальной буквы диска.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если путь является существующим обычным файлом. Это следует за символическими ссылками, поэтому и islink(), и isfile() могут быть истинными для одного и того же пути.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если путь является существующим каталогом. Это следует за символическими ссылками, поэтому и islink(), и isdir() могут быть истинными для одного и того же пути.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если путь указывает на существующую запись каталога, являющуюся символической ссылкой. Всегда False, если символические ссылки не поддерживаются средой выполнения Python.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвратите True, если путь путь является точкой монтирования: точкой в ​​файловой системе, где была смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский элемент path, path /.., на устройстве, отличном от path, или path /.. и path указывают на один и тот же i-узел на одном и том же устройстве — это должно определять точки монтирования для всех вариантов Unix и POSIX. Он не может надежно обнаружить монтирование привязки в той же файловой системе. В Windows корневая буква диска и UNC общего ресурса всегда являются точками подключения, а для любого другого пути вызывается GetVolumePathName, чтобы проверить, отличается ли он от входного пути.

Новое в версии 3.4: поддержка обнаружения точек монтирования без полномочий root в Windows.

Изменено в версии 3.6: принимает объект, подобный пути .

Разумно присоединяйтесь к одному или нескольким компонентам пути. Возвращаемое значение представляет собой конкатенацию path и любых элементов *paths с ровно одним разделителем каталогов после каждой непустой части, кроме последней, что означает, что результат будет только в разделителе, если последняя часть пуста. Если компонент является абсолютным путем, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.

В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r'\foo' ). Если компонент содержит букву диска, все предыдущие компоненты удаляются, а буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .

Изменено в версии 3.6: принимает объект, подобный пути, для path и paths.

Нормализуйте регистр имени пути. В Windows преобразуйте все символы в имени пути в нижний регистр, а также преобразуйте косую черту в обратную косую черту. В других операционных системах верните путь без изменений.

Изменено в версии 3.6: принимает объект, подобный пути .

Нормализуйте имя пути, удалив лишние разделители и ссылки более высокого уровня, чтобы A//B , A/B/ , A/./B и A/foo/../B становятся A/B . Эта манипуляция со строкой может изменить значение пути, содержащего символические ссылки. В Windows он преобразует прямую косую черту в обратную косую черту. Чтобы нормализовать регистр, используйте normcase() .

В системах POSIX в соответствии со стандартом IEEE Std 1003.1, редакция 2013 г.; 4.13 Разрешение имени пути: если имя пути начинается ровно с двух косых черт, первый компонент, следующий за начальными символами, может интерпретироваться способом, определяемым реализацией, хотя более двух начальных символов должны рассматриваться как один символ.

Изменено в версии 3.6: принимает объект, подобный пути .

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

Если путь не существует или встречается цикл символической ссылки, а strict имеет значение True , возникает ошибка OSError. Если strict имеет значение False , путь разрешается, насколько это возможно, и любой остаток добавляется без проверки его существования.

Эта функция эмулирует процедуру операционной системы для создания канонического пути, которая немного отличается в Windows и UNIX в отношении того, как взаимодействуют ссылки и последующие компоненты пути.

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

Изменено в версии 3.6: принимает объект, подобный пути .

Изменено в версии 3.8: символические ссылки и соединения теперь разрешаются в Windows.

Изменено в версии 3.10: добавлен параметр strict.

Возвращает относительный путь к файлу в путь либо из текущего каталога, либо из необязательного начального каталога. Это вычисление пути: к файловой системе нет доступа для подтверждения существования или природы path или start. В Windows возникает ошибка ValueError, когда path и start находятся на разных дисках.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если оба аргумента имени пути относятся к одному и тому же файлу или каталогу. Это определяется номером устройства и номером i-узла и вызывает исключение, если вызов os.stat() для любого имени пути завершается ошибкой.

Изменено в версии 3.2: добавлена ​​поддержка Windows.

Изменено в версии 3.4: Windows теперь использует ту же реализацию, что и все другие платформы.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если файловые дескрипторы fp1 и fp2 ссылаются на один и тот же файл.

Изменено в версии 3.2: добавлена ​​поддержка Windows.

Изменено в версии 3.6: принимает объект, подобный пути .

Возвращает значение True, если кортежи статистики stat1 и stat2 ссылаются на один и тот же файл. Эти структуры могли быть возвращены функциями os.fstat(), os.lstat() или os.stat(). Эта функция реализует базовое сравнение, используемое функциями samefile() и sameopenfile().

Изменено в версии 3.4: добавлена ​​поддержка Windows.

Изменено в версии 3.6: принимает объект, подобный пути .

Разделите путь path на пару (head, tail), где tail — последний компонент пути, а head — все, что предшествует к тому, что. Часть хвост никогда не будет содержать косую черту; если path заканчивается косой чертой, tail будет пустым. Если в path нет косой черты, head будет пустым. Если path пуст, то и head, и tail пусты. Конечная косая черта удаляется из head, если только это не корень (только одна или несколько косых черт). Во всех случаях join(head, tail) возвращает путь к тому же местоположению, что и path (но строки могут отличаться). Также см. функции dirname() и basename() .

Изменено в версии 3.6: принимает объект, подобный пути .

Разделите имя пути path на пару (диск, хвост), где диск – это либо точка монтирования, либо пустая строка. В системах, не использующих спецификации диска, диск всегда будет пустой строкой. Во всех случаях диск + хвост будет таким же, как путь.

В Windows разделяет путь на диск/UNC точку доступа и относительный путь.

Если путь содержит букву диска, диск будет содержать все до двоеточия включительно:

Если путь содержит путь UNC, диск будет содержать имя хоста и общий ресурс, вплоть до четвертого разделителя, но не включая его:

Изменено в версии 3.6: принимает объект, подобный пути .

Разделите путь path на пару (root, ext) таким образом, чтобы root + ext == path , а расширение ext было пустым или начиналось с период и содержит не более одного периода.

Если путь не содержит расширения, ext будет '' :

Если путь содержит расширение, то ext будет установлено на это расширение, включая начальную точку. Обратите внимание, что предыдущие периоды будут игнорироваться:

Начальные точки последнего компонента пути считаются частью корня:

Изменено в версии 3.6: принимает объект, подобный пути .

Верно, если в качестве имен файлов можно использовать произвольные строки Unicode (с учетом ограничений, накладываемых файловой системой).

Учитывая такой путь, как "mydir/myfile.txt", как найти абсолютный путь к файлу относительно текущего рабочего каталога в Python? Например. в Windows я мог бы получить:

11 ответов 11

Также работает, если это уже абсолютный путь:

Примечание. На большинстве платформ это эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)) . Поэтому, если mydir/myfile.txt не находится под os.getcwd() , абсолютный путь не является реальным путем.

@коанор ? Без явного корня mydir/myfile.txt неявно ссылается на путь внутри текущего рабочего каталога, что эквивалентно ./mydir/myfile.txt. Возможно, это не тот путь, который вы намеревались ввести, но, насколько я могу судить, он кажется правильной интерпретацией пути. Не могли бы вы уточнить?

@jpmc26 Я не совсем согласен с coanor, но я бы сказал, что (вопреки тому, что я предполагал) нет связи между аргументом функции abspath и реальным файлом. Вы можете указать любое имя пути — несуществующие файлы и иерархии каталогов допустимы — и abspath просто разрешит биты пути (включая элемент родительского каталога « .. ») и вернет строку. Это просто строка, вычисленная из текущего каталога; любая корреляция с реальным файлом кажется случайной. Попробуйте os.path.abspath("/wow/junk/../blha/hooey") . Это работает.

@MikeS Честно говоря, я не понимаю, почему такое поведение может быть неожиданным. Это абсолютный путь, а не абсолютный файл или каталог. Если вам нужна проверка существования, вызовите os.path.exists . Наоборот, такие системы, как PowerShell, которые настаивают на том, чтобы путь существовал со стандартной функцией разрешения пути, неудобны в использовании.

@jpmc26 Предполагать, что путь — это просто строка, которая выглядит как имя пути, совсем непонятно, и это противоречит тому, как я много лет думал и говорил о путях. Я цитирую документы Python 3 для abspath: «Вернуть нормализованную абсолютизированную версию пути path». Не a". версия string path". Путь, как определено Posix, представляет собой «строку, которая используется для идентификации файла». Документы Python явно указывают на relpath : «к файловой системе нет доступа для подтверждения существования или характера пути». Если аргумент здесь очевиден, зачем указывать relpath явно?

Читайте также: