Python os.path.join on Windows
I am trying to learn python and am making a program that will output a script. I want to use os.path.join, but am pretty confused. According to the docs if I say:
I get «C:sourcedir» . According to the docs, this is normal, right?
But when I use the copytree command, Python will output it the desired way, for example:
Here is the error code I get:
If I wrap the os.path.join with os.path.normpath I get the same error.
If this os.path.join can’t be used this way, then I am confused as to its purpose.
According to the pages suggested by Stack Overflow, slashes should not be used in join—that is correct, I assume?
11 Answers 11
Windows has a concept of current directory for each drive. Because of that, «c:sourcedir» means «sourcedir» inside the current C: directory, and you’ll need to specify an absolute directory.
Any of these should work and give the same result, but I don’t have a Windows VM fired up at the moment to double check:
To be even more pedantic, the most python doc consistent answer would be:
Since you also need os.sep for the posix root path:
The reason os.path.join(‘C:’, ‘src’) is not working as you expect is because of something in the documentation that you linked to:
Note that on Windows, since there is a current directory for each drive, os.path.join(«c:», «foo») represents a path relative to the current directory on drive C: (c:foo), not c:\foo.
As ghostdog said, you probably want mypath=os.path.join(‘c:\\’, ‘sourcedir’)
To be pedantic, it’s probably not good to hardcode either / or \ as the path separator. Maybe this would be best?
For a system-agnostic solution that works on both Windows and Linux, no matter what the input path, one could use os.path.join(os.sep, rootdir + os.sep, targetdir)
I’d say this is a (windows)python bug.
I think this statement should be True
But it is False on windows machines.
to join a windows path, try
basically, you will need to escape the slash
You have a few possible approaches to treat path on Windows, from the most hardcoded ones (as using raw string literals or escaping backslashes) to the least ones. Here follows a few examples that will work as expected. Use what better fits your needs.
Consent with @georg-
I would say then why we need lame os.path.join — better to use str.join or unicode.join e.g.
answering to your comment : «the others ‘//’ ‘c:’, ‘c:\\’ did not work (C:\\ created two backslashes, C:\ didn’t work at all)»
On windows using os.path.join(‘c:’, ‘sourcedir’) will automatically add two backslashes \\ in front of sourcedir.
To resolve the path, as python works on windows also with forward slashes -> ‘/’, simply add .replace(‘\\’,’/’) with os.path.join as below:-
os.path.join(‘c:\\’, ‘sourcedir’).replace(‘\\’,’/’)
e.g: os.path.join(‘c:\\’, ‘temp’).replace(‘\\’,’/’)
output : ‘C:/temp’
The proposed solutions are interesting and offer a good reference, however they are only partially satisfying. It is ok to manually add the separator when you have a single specific case or you know the format of the input string, but there can be cases where you want to do it programmatically on generic inputs.
With a bit of experimenting, I believe the criteria is that the path delimiter is not added if the first segment is a drive letter, meaning a single letter followed by a colon, no matter if it corresponds to a real unit.
Python | метод os.path.join ()
Модуль ОС в Python предоставляет функции для взаимодействия с операционной системой. ОС поставляется под стандартные служебные модули Python. Этот модуль предоставляет портативный способ использования функциональных возможностей, зависящих от операционной системы. Модуль os.path — это подмодуль модуля ОС в Python, используемый для работы с общими путями.
os.path.join() в Python os.path.join() объединяет один или несколько компонентов пути. Этот метод объединяет различные компоненты пути с ровно одним разделителем каталогов (‘/’) после каждой непустой части, кроме последнего компонента пути. Если последний компонент пути, к которому нужно присоединиться, пуст, то в конце ставится разделитель каталогов (‘/’).
Если компонент пути представляет абсолютный путь, то все предыдущие соединенные компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.
Parameter:
path: A path-like object representing a file system path.
*path: A path-like object representing a file system path. It represents the path components to be joined.
A path-like object is either a string or bytes object representing a path.
Note: The special syntax *args (here *paths) in function definitions in python is used to pass a variable number of arguments to a function.
Return Type: This method returns a string which represents the concatenated path components.
Код: использование метода os.path.join () для объединения различных компонентов пути
# Python-программа для объяснения метода os.path.join ()
# импорт модуля os
# Присоединиться к различным компонентам пути
print (os.path.join(path, «User/Desktop» , «file.txt» ))
# Присоединиться к различным компонентам пути
print (os.path.join(path, «/home» , «file.txt» ))
# В приведенном выше примере ‘/ home’
# представляет абсолютный путь
# так что все предыдущие компоненты т.е. пользователь / документы
# выброшены и присоединение продолжается
# из абсолютного компонента пути т.е. / home.
# Присоединиться к различным компонентам пути
print (os.path.join(path, «Downloads» , «file.txt» , «/home» ))
# В приведенном выше примере ‘/ User’ и ‘/ home’
# оба представляют абсолютный путь
# но ‘/ home’ — последнее значение
# так что все предыдущие компоненты перед ‘/ home’
# будут отброшены и присоединятся
# продолжить из ‘/ home’
# Присоединиться к различным компонентам пути
print (os.path.join(path, «User/Public/» , «Documents» , «»))
# В приведенном выше примере последний
# компонент пути пуст
# поэтому разделитель каталогов (‘/’)
# будет поставлено в конце
# вместе с объединенным значением
os.path — Общие манипуляции с путями к файлам и каталогам¶
Исходный код: Lib/posixpath.py (for POSIX) and Lib/ntpath.py (for Windows NT).
Модуль реализует некоторые полезные функции для работы с именами путей к файлам и каталогам. Для чтения или записи файлов см. раздел open() , а для доступа к файловой системе см. модуль os . Параметры пути могут передаваться как строками, так и байтами. Приложениям рекомендуется представлять имена файлов как (Юникод) символьные строки. К сожалению, некоторые имена файлов могут не быть представлены как строки в Unix, поэтому приложения, которым необходимо поддерживать произвольные имена файлов в Unix, должны использовать байты объектов для представления имен путей. Наоборот, использование объектов байтов не может представлять все имена файлов на Windows (в стандартной mbcs кодировке), следовательно приложения Windows должны использовать объекты строки получить доступ ко всем файлам.
В отличие от оболочки UNIX, Python не выполняет расширения пути автоматически. Функции, такие как expanduser() и expandvars() , могут вызываться явно, когда приложение желает расширения оболочечного пути. (См. также модуль glob .
Модуль pathlib предлагает высокоуровневые объекты пути.
Все эти функции принимают в качестве своих параметров только байты или только объекты строки. Результат — объект того же типа, если путь или имя файла равно возвращенный.
Поскольку разные операционные системы имеют различные соглашения по именам путей, в стандартной библиотеке существует несколько версий этого модуля. Модуль os.path всегда — модуль пути, подходящий для операционной системы, Python продолжается, и поэтому применимый для путей локальная. Однако можно также импортировать и использовать отдельные модули, если требуется манипулировать путем, всегда в одном из различных форматов. Все они имеют одинаковый интерфейс:
- posixpath для путей в стиле UNIX ntpath для путей Windows
Изменено в версии 3.8: exists() , lexists() , isdir() , isfile() , islink() и ismount() теперь возвращает False вместо того, чтобы поднять исключение для путей, которые содержат знаки или байты, непредставимо на уровне ОС.
Возвращает нормализованную абсолютизированную версию пути path. На большинстве платформ это эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)) .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает базовое имя пути path. Это второй элемент пары возвращенный путем передачи path функции split() . Обратите внимание, что результат этой функции отличается от программы Unix basename; где basename для ‘/foo/bar/’ возвращает ‘bar’ функция basename() возвращает пустая строка ( » ).
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает самый длинный общий под-путь каждого пути в последовательности paths. Поднять ValueError , если paths содержат абсолютные и относительные пути, paths находятся на разных дисках или если paths пуст. В отличие от commonprefix() , этот возвращает действительный путь.
Добавлено в версии 3.5.
Изменено в версии 3.6: Принимает последовательность путеподобных объектов .
Возвращает самый длинный префикс пути (взятый символ-за-символом), который является префиксом всех путей в list. Если list пуст, возвращает пустой строка ( » ).
Эта функция может недействительные пути возвращает, потому что она работает символ за один раз. Сведения о получении допустимого пути см. в разделе commonpath() .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает имя каталога пути path. Это первый элемент пары возвращенный путем передачи path функции split() .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True если path ссылается на существующий путь или открытый файл дескриптор. Возвращает False для разорванных символических ссылок. На некоторых платформах эта функция может возвращает False , если разрешение не дано, чтобы выполнить os.stat() на запрошенный файле, даже если path физически существует.
Изменено в версии 3.3: path теперь может быть целым числом: True является возвращенный, если это открытый файл дескриптор, False иначе.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True если path ссылается на существующий путь. Возвращает True для разорванных символических ссылок. Эквивалентно exists() на платформах, не имеющих os.lstat() .
Изменено в версии 3.6: Принимает путеподобный объект .
На Unix и Windows, возвращает спор с начальным компонентом
user заменен корневым каталогом того user.
На Unix начальный
заменен переменной окружения HOME , если это установлено; в противном случае исходный каталог текущего пользователя просматривается в каталоге паролей через встроенный модуль pwd . Начальный
user ищется непосредственно в справочнике пароля.
В Windows USERPROFILE будет используемый, если установлен, в противном случае будет используемый комбинация HOMEPATH и HOMEDRIVE . Начальный
user обработан, отделив последний директивный компонент от созданного пользовательского пути, полученного выше.
Если расширение терпит неудачу или если путь не начинается с тильды, путь возвращенный неизменный.
Изменено в версии 3.6: Принимает путеподобный объект .
Изменено в версии 3.8: Больше не использует HOME в Windows.
Возвращает аргумент с развернутыми переменными среды. Подстроки вида $name или $
В Windows расширения %name% поддерживаются в дополнение к $name и $
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает время последнего доступа path. возвращает значение — это число с плавающей запятой, дающее число секунд с момента окончания эпохи (см. модуль time ). Поднять OSError , если файл не существует или недоступен.
os.path. getmtime ( path ) ¶
Возвращает время последней модификации path. возвращает значение — это число с плавающей запятой, дающее число секунд с момента окончания эпохи (см. модуль time ). Поднять OSError , если файл не существует или недоступен.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает время работы системы, которое в некоторых системах (таких как Unix) является временем последнего изменения метаданных, а в других (таких как Windows) — временем создания path. Параметр возвращает значение — это число, указывающее число секунд с момента наступления эпохи (см. модуль time ). Поднять OSError , если файл не существует или недоступен.
Изменено в версии 3.6.
Возвращает размер path в байтах. Поднять OSError , если файл не существует или недоступен.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True if path — абсолютное имя пути. В Unix, это означает, что он начинается с косой черты, в Windows, что он начинается с (задней) косой черты после отсечения потенциальной буквы диска.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True если path является обычным файлом existing . Это следует за символическими ссылками, поэтому и islink() , и isfile() могут быть верны для одного и того же пути.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True if path является каталогом existing . Это следует за символическими ссылками, поэтому и islink() , и isdir() могут быть верны для одного и того же пути.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True if path ссылается на запись каталога existing , которая является символической ссылкой. Всегда False , если символьные ссылки не поддерживаются средой выполнения Python.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если имя пути path — mount point: точка в файловой системе, где другая файловая система была установлена. На POSIX функция проверяет, является ли родитель path, path /.. , на другом устройстве, чем path, или указывают ли path /.. и path на тот же i-узел на том же устройстве —, это должно обнаружить точки монтирования для всего Unix и вариантов POSIX. Он не может надежно обнаружить подключения привязки в той же файловой системе. На Windows корень имени диска и UNC акции всегда — точки монтирования, и для любого другого пути GetVolumePathName называют, чтобы видеть, отличается ли это от входного пути.
Добавлено в версии 3.4: Поддержка обнаружения некорневых точек подключения в Windows.
Изменено в версии 3.6: Принимает путеподобный объект .
Интеллектуально соедините один или несколько компонентов пути. возвращает значение — это конкатенация path и любых членов *paths с только одним разделителем каталогов ( os.sep ) после каждой непустой части, кроме последней, что означает, что результат заканчивается разделителем только в том случае, если последняя часть пуста. Если компонент является абсолютным путем, все предыдущие компоненты выбрасываются, и соединение продолжается от компонента абсолютного пути.
В 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() .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает канонический путь к указанному имени файла, исключая любые встречающиеся в пути символические ссылки (если они поддерживаются операционной системой).
Когда символические циклы ссылки произойдут, путь возвращенный будет одним членом цикла, но никакая гарантия не сделана, о который член, который будет.
Изменено в версии 3.6: Принимает путеподобный объект .
Изменено в версии 3.8: Символические связи и соединения теперь разрешены в Windows.
Возвращает относительный filepath к path или из текущего каталога или из дополнительного каталога start. Это вычисление пути: файловая система недоступна для подтверждения существования или природы path или start.
start по умолчанию принимает значение os.curdir .
Изменено в версии 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 — все приводящее к этому. Часть tail никогда не будет содержать косую черту; если path заканчивается косой чертой, tail будет пустым. Если в path нет косой черты, head будет пустым. Если path пуст, то и head, и tail пусты. Если это не корень (только одна или несколько косых черт), конечные косые черты удаляются из head. Во всех случаях, join(head, tail) возвращает путь к тому же местоположению как path (но строки может отличаться). Также см. функции dirname() и basename() .
Изменено в версии 3.6: Принимает путеподобный объект .
Разделите путь path на пару (drive, tail) , где drive является точкой монтирования или пустым строка. В системах, в которых не используются спецификации дисков, drive всегда будет пустой строка. Во всех случаях drive + tail будет таким же, как path.
В Windows разбивает путь на диск/UNC sharepoint и относительный путь.
Если путь содержит букву диска, диск будет содержать все, включая двоеточие. например, splitdrive(«c:/dir») возвращает («c:», «/dir»)
Если путь содержит UNC-путь, диск будет содержать имя узла и общий ресурс, но не будет содержать четвертый разделитель. например, splitdrive(«//host/computer/dir») возвращает («//host/computer», «/dir»)
Изменено в версии 3.6: Принимает путеподобный объект .
Разделите имя пути path на пару (root, ext) , так что root + ext == path и ext пусты или начинаются с точки и содержат не более одного периода. Предшествующие периоды в основном имени игнорируются; splitext(‘.cshrc’) возвращает (‘.cshrc’, ») .
Изменено в версии 3.6: Принимает путеподобный объект .
True , если произвольный Юникод строки могут быть используемы как имена файлов (в рамках ограничений, наложенных файловой системой).