- Почему в этом случае не работает os.path.join()?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Почему не ОС.путь.join () работать в этом случае?
- 11 ответов
- Почему в этом случае не работает os.path.join ()?
- 13 ответов
- Примеры использования модуля os в Python
- os.name
- os.environ, os.getenv() и os.putenv()
- os.chdir() и os.getcwd()
- os.mkdir() и os.makedirs()
- Python os.path.join on Windows
- 11 Answers 11
Почему в этом случае не работает os.path.join()?
Приведенный ниже код не будет объединяться, когда отладка команды не сохраняет весь путь, а только последнюю запись.
Когда я тестирую это, он сохраняет только часть /new_sandbox/ кода.
ОТВЕТЫ
Ответ 1
Последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все до них отбрасывается.
Если компонент является абсолютным путем, все предыдущие компоненты выбрасываются, и соединение продолжается от компонента абсолютного пути.
Примечание о Windows, поведение по отношению к буквам диска, которое, похоже, изменилось по сравнению с более ранними версиями Python:
В Windows буква диска не является reset, когда встречается компонент абсолютного пути (например, r’\foo’ ). Если компонент содержит букву диска, все предыдущие компоненты выбрасываются, а буква диска reset. Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join(«c:», «foo») представляет путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .
Ответ 2
Идея os.path.join() заключается в том, чтобы сделать вашу программу кросс-платформенной (linux/windows/etc).
Даже одна черта рушится.
Таким образом, это имеет смысл только при использовании с некоторой точкой отсчета, например os.environ[‘HOME’] или os.path.dirname(__file__) .
Ответ 3
os.path.join() может использоваться совместно с os.path.sep для создания абсолютного, а не относительного пути.
Ответ 4
Не используйте прямую косую черту в начале компонентов пути, кроме случаев обращения к корневому каталогу:
Ответ 5
Чтобы понять, почему это удивительное поведение не совсем ужасно, рассмотрите приложение, которое принимает имя файла конфигурации в качестве аргумента:
Если приложение выполнено с помощью:
Будет использоваться конфигурационный файл /etc/myapp.conf/foo.conf .
Но подумайте, что произойдет, если приложение вызвано с помощью:
Затем myapp должен использовать конфигурационный файл в /some/path/bar.conf (а не /etc/myapp.conf/some/path/bar.conf или аналогичный).
Это может быть не очень хорошо, но я считаю, что это мотивация для поведения абсолютного пути.
Ответ 6
Это потому, что ваш ‘/new_sandbox/’ начинается с / и поэтому считается относительным к корневому каталогу. Удалите ведущий / .
Ответ 7
Чтобы сделать вашу функцию более переносимой, используйте ее как таковую:
Ответ 8
Попробуйте комбинировать split(«/») и * для строк с существующими объединениями.
Как это работает.
split(«/») превращает существующий путь в список: [», ‘home’, ‘build’, ‘test’, ‘sandboxes’, »]
* перед списком выделяет каждый элемент списка своим собственным параметром
Источник
Почему не ОС.путь.join () работать в этом случае?
приведенный ниже код не будет присоединяться, при отладке команда сохраняет не весь путь, а только последнюю запись.
когда я тестирую это, он хранит только /new_sandbox/ часть кода.
11 ответов
последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все, что перед ними, отбрасывается.
если компонент является абсолютным путем, все предыдущие компоненты выбрасываются и соединение продолжается из компонента абсолютного пути.
обратите внимание на Windows, поведение по отношению к буквы, которые кажется, изменилось по сравнению с более ранними версиями Python:
в Windows буква диска не сбрасывается, когда компонент абсолютного пути (например, r’\foo’ ) встречаются. Если компонент содержит букву диска, все предыдущие компоненты выбрасываются и буква диска сбрасывается. Обратите внимание, что, поскольку для каждого диска есть текущий каталог, os.path.join(«c:», «foo») представляет собой путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .
идея os.path.join() сделать вашу программу кросс-платформенной (linux/windows/etc).
даже один разрез разрушает его.
Так что это имеет смысл только при использовании с какой-то точкой отсчета, как os.environ[‘HOME’] или os.path.dirname(__file__) .
os.path.join() может использоваться в сочетании с os.path.sep создать абсолютный, а не относительный путь.
Не используйте косые черты в начале компонентов пути, кроме как при ссылке на корневой каталог:
Это потому, что ваш ‘/new_sandbox/’ начинается с / и, таким образом, предполагается относительно корневого каталога. Уберите ведущий / .
чтобы помочь понять, почему это удивительное поведение не полностью ужасно, рассмотрим приложение, которое принимает имя файла конфигурации в качестве аргумента:
если приложение выполняется с:
файл config /etc/myapp.conf/foo.conf будет использоваться.
но рассмотрим, что произойдет, если приложение вызывается с:
затем myapp должны использовать файл config в /some/path/bar.conf (а не /etc/myapp.conf/some/path/bar.conf или похожие).
это может быть не очень здорово, но я считаю, что это мотивация для поведения абсолютного пути.
чтобы сделать вашу функцию более портативной, используйте ее как таковую:
Источник
Почему в этом случае не работает os.path.join ()?
Приведенный ниже код не присоединится, когда при отладке команда сохраняет не весь путь, а только последнюю запись.
Когда я проверяю это, он сохраняет только часть кода /new_sandbox/ .
13 ответов
Последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все, что перед ними, отбрасывается.
Если компонент является абсолютным путем, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.
Обратите внимание на Windows, поведение по отношению к буквам дисков, которое, кажется, изменилось по сравнению с более ранними версиями Python:
В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r’\foo’ ). Если компонент содержит букву диска, все предыдущие компоненты отбрасываются и буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join(«c:», «foo») представляет путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .
os.path.join() может использоваться вместе с os.path.sep для создания абсолютного, а не относительного пути.
Чтобы понять, почему это удивительное поведение не полностью ужасно, рассмотрим приложение, которое принимает имя файла конфигурации в качестве аргумента:
Если приложение выполняется с:
Будет использован файл конфигурации /etc/myapp.conf/foo.conf .
Но подумайте, что произойдет, если приложение вызывается с помощью:
Тогда myapp должен использовать файл конфигурации в /some/path/bar.conf (а не /etc/myapp.conf/some/path/bar.conf или подобном).
Это может быть не очень хорошо, но я считаю, что это мотивация для абсолютного пути поведения.
Идея os.path.join() состоит в том, чтобы сделать вашу программу кроссплатформенной (linux / windows / etc).
Даже один слэш разрушает его.
Так что это имеет смысл только при использовании с какой-то точкой отсчета, как os.environ[‘HOME’] или os.path.dirname(__file__) .
Это потому, что ваш ‘/new_sandbox/’ начинается с / и, таким образом, считается относительным к корневому каталогу. Удалить ведущий / .
Чтобы сделать вашу функцию более переносимой, используйте ее следующим образом:
Обратите внимание, что подобная проблема может вас укусить, если вы используете os.path.join() для включения расширения, которое уже содержит точку, что происходит автоматически при использовании os.path.splitext() . В этом примере:
Хотя extension может быть .jpg , в итоге вы получите папку с именем «foobar», а не файл с именем «foobar.jpg». Чтобы предотвратить это, вам нужно добавить расширение отдельно:
Попробуйте комбинировать split(«/») и * для строк с существующими объединениями.
Как это работает .
split(«/») превращает существующий путь в список: [», ‘home’, ‘build’, ‘test’, ‘sandboxes’, »]
* перед списком выделяет каждый элемент списка своим собственным параметром
Не используйте прямую косую черту в начале компонентов пути, за исключением случаев обращения к корневому каталогу:
Источник
Примеры использования модуля os в Python
Данный модуль можно применять во многих случаях. В данном разделе мы не рассмотрим каждый из них. Вместо этого, мы рассмотрим, как именно его можно применять, а также ознакомимся с подмодулем, под названием os.path. В частности, мы расскажем о:
Это может выглядеть как большой объем материала, но есть еще минимум десяток других задач, которые модуль os может выполнять. Так что данный раздел можно назвать кратким экскурсом. Для использования любого из методов, упомянутых в данном разделе, вам нужно импортировать модуль os, вот так:
os.name
Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Windows 7:
Это говорит нам о том, что наш экземпляр Пайтон работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1.
os.environ, os.getenv() и os.putenv()
Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены.
Это дает вам полезную информацию, такую как количество процессоров, тип ОЗУ, имя компьютера, и так далее. Посмотрим, что мы сможем узнать о нашем компьютере:
Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, это вернуло словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например:
Вы также можете использовать функцию os.getenv для доступа к этой переменной:
Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере:
Результат выполнения данного скрипта:
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
os.chdir() и os.getcwd()
Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями:
Указанный код демонстрирует нам, что мы открыли директорию по умолчанию в Пайтоне, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно.
os.mkdir() и os.makedirs()
Как вы могли догадаться, эти два метода используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем:
Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к os.mkdir(). Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция os.makedirs() создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Лично я часто прибегал к данному решению, когда была необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример:
Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе.
Источник
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
To be even more pedantic, the most python doc consistent answer would be:
Since you also need os.sep for the posix root path:
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 pedantic, it’s probably not good to hardcode either / or \ as the path separator. Maybe this would be best?
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’)
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.
Источник