Відповіді:
>>> 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
пропонує спосіб знайти abs шлях.
Але більшість шляхів у Linux починаються з ~
(tilde), що не дає задовільного результату.
тому ви можете використовувати 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
Я вважаю за краще використовувати глобус
ось як перелічити всі типи файлів у вашій поточній папці:
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
передбачає ваші перші два випадки ...