Як перевірити, чи шлях є абсолютним шляхом чи відносним шляхом в крос-платформеному шляху з 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.