Ответы:
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Также работает, если это уже абсолютный путь:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
normpath()
следующим образом : normpath(join(os.getcwd(), path))
. Так что, если mydir/myfile.txt
не под os.getcwd()
, абсолютный путь не является реальным путем .
mydir/myfile.txt
неявно ссылается на путь в текущем рабочем каталоге, который, следовательно, эквивалентен ./mydir/myfile.txt
. Возможно, это не тот путь, который вы намеревались ввести, но, насколько я могу судить, это похоже на правильную интерпретацию пути. Не могли бы вы уточнить?
abspath
функции и реальным файлом. Вы могли бы указать любые пути-несуществующие файлы и каталоги в порядке, и abspath просто разрешит биты пути (включая ..
элемент родительского каталога " ") и вернет строку. Это просто строка, вычисленная из текущего каталога; кажется, что любая корреляция с реальным файлом является случайной. Попробуй os.path.abspath("/wow/junk/../blha/hooey")
. Оно работает.
os.path.exists
. Наоборот, такие системы, как PowerShell, которые настаивают на пути, существующем со стандартной функцией разрешения пути, являются трудной задачей.
relpath
path
relpath
Вы можете использовать новую библиотеку Python 3.4 pathlib
. (Вы также можете получить его для Python 2.6 или 2.7, используя pip install pathlib
.) Авторы написали : «Цель этой библиотеки - предоставить простую иерархию классов для обработки путей файловой системы и общих операций, которые пользователи выполняют над ними».
Чтобы получить абсолютный путь в Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
Или в UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
Документы находятся здесь: https://docs.python.org/3/library/pathlib.html
os.path.abspath()
дало мне ошибку: AttributeError: 'NoneType' object has no attribute 'startswith'
использование Path().resolve()
не с тем же относительным путем к файлу. (Linux и Python3.4)
Более того, установите модуль (найден на PyPI
), он оборачивает все os.path
функции и другие связанные функции в методы объекта, который можно использовать везде, где используются строки:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
pathlib
. Смотрите мой ответ в этой теме.
from path import Path
затемPath('mydir/myfile.txt').abspath()
path
модуль. Связанный модуль использует класс с именем path
.
Сегодня вы также можете использовать unipath
пакет, основанный на path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Я бы порекомендовал использовать этот пакет, поскольку он предлагает чистый интерфейс для общих утилит os.path .
Обновление для Python 3.4+, pathlib
которое фактически отвечает на вопрос:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Если вам нужна только временная строка, имейте в виду, что вы можете использовать Path
объекты со всеми соответствующими функциями os.path
, включая, конечно abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Обратите внимание, что expanduser
это необходимо (в Unix) в случае, если данное выражение для имени файла (или каталога) и местоположения может содержать ~/
начальный символ (тильда относится к домашнему каталогу пользователя) и expandvars
заботится о любых других переменных среды (например $HOME
).
Это всегда возвращает правильное имя файла текущего скрипта, даже если он вызывается из другого скрипта. Это особенно полезно при использовании subprocess
.
import sys,os
filename = sys.argv[0]
оттуда вы можете получить полный путь к скрипту:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
Это также упрощает навигацию по папкам, просто добавляя /..
столько раз, сколько вы хотите, чтобы перейти вверх по иерархии каталогов.
Чтобы получить cwd:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Для родительского пути:
>>> os.path.abspath(filename+"/../..")
'/foo'
Комбинируя "/.."
с другими именами файлов, вы можете получить доступ к любому файлу в системе.
Модуль os
предоставляет способ найти путь пресса.
НО большинство путей в Linux начинаются с ~
(тильды), что не дает удовлетворительного результата.
так что вы можете использовать srblib
для этого.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
установить его с помощью python3 -m pip install srblib
Я предпочитаю использовать glob
Вот как можно перечислить все типы файлов в текущей папке:
import glob
for x in glob.glob():
print(x)
Вот как перечислить все (например) файлы .txt в вашей текущей папке:
import glob
for x in glob.glob('*.txt'):
print(x)
Вот как можно перечислить все типы файлов в выбранной директории:
import glob
for x in glob.glob('C:/example/hi/hello/'):
print(x)
надеюсь, это помогло тебе
os.path.abspath()
) к любому относительному пути, glob
если ты на маке
import os
upload_folder = os.path.abspath("static/img/users")
это даст вам полный путь:
print(upload_folder)
покажет следующий путь:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user