Як перевірити, чи шлях є абсолютним шляхом чи відносним шляхом в крос-платформеному шляху з Python?


142

Абсолютний шлях UNIX починається з '/', тоді як Windows починається з алфавіту 'C:' або '\'. Чи має python стандартну функцію, щоб перевірити, чи шлях є абсолютним чи відносним?

Відповіді:


207

os.path.isabsповертається, Trueякщо шлях абсолютний, Falseякщо ні. Документація говорить, що вона працює у Windows (я можу підтвердити, що вона працює в Linux особисто).

os.path.isabs(my_path)

1
Ця функція не є міжплатформою. У Unix os.path.isabs('c:\\')повертається False.
anatoly techtonik

69
Rotfl, і він повинен повернути False, оскільки C: \\ не є абсолютним шляхом у системі Unix. Абсолютні шляхи на платформах unix починаються з "/", як "/ var / custApp /" тощо. :)
Marek Lewandowski

29
@techtonik Щоб зробити це абсолютно зрозумілим для всіх, хто може знайти це: `c: \` - це абсолютно дійсне ім'я файлу / каталогу в unix. Отже, це дійсно був би відносний шлях у системі Unix. Отже, функція є кросплатформою. Тому що це враховує особливості Windows та Unix.
Леммінг

1
Саме так. Він не веде себе однаково на різних платформах, це дає правильну відповідь для поточної платформи.
Кевін Кокс

Не відповідаючи на запитання. Щоб мати правила для платформ, використовуйте "ntpath" або "posixpath" замість "os.path"
Shoham

43

І якщо те, що ви насправді хочете, - це абсолютний шлях, не турбуйтеся перевіряти, чи є він, просто отримайте abspath:

import os

print os.path.abspath('.')

7
можливо, він не відповів на початкове запитання, але саме те, що я шукав, не усвідомлюючи цього. Дякую!
мефісто



5

Власне, я думаю, що жодна з вищезазначених відповідей не вирішила справжнього питання: крос-платформні шляхи. Що робить os.path, це завантажувати ОС залежною від версії бібліотеки "шлях". тому рішення полягає в тому, щоб явно завантажити відповідну бібліотеку шляху до ОС:

import ntpath
import posixpath

ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
    True
posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
    False

Так! Питання конкретно згадує як Windows, так і Linux-контури! Швидкий def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
однолінійний

4

Від python 3.4 pathlib доступний.

In [1]: from pathlib import Path

In [2]: Path('..').is_absolute()
Out[2]: False

In [3]: Path('C:/').is_absolute()
Out[3]: True

In [4]: Path('..').resolve()
Out[4]: WindowsPath('C:/the/complete/path')

In [5]: Path('C:/').resolve()
Out[5]: WindowsPath('C:/')

1
Ця відповідь насправді працює в Windows .. Path('\tmp').is_absolute()дає правильно False, а os.path.isabs('\tmp')дає неправильно True. (Дехто заперечує, що \tmpце абсолютний шлях до Windows, але це справедливо лише для дуже марного визначення абсолютного шляху .)
Zbyl

0

інший спосіб, якщо ви не в поточному робочому каталозі, начебто брудний, але він працює для мене.

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.