Làm cách nào để kiểm tra xem một đường dẫn là đường dẫn tuyệt đối hay đường dẫn tương đối theo cách đa nền tảng với Python?


142

Đường dẫn tuyệt đối UNIX bắt đầu bằng '/', trong khi Windows bắt đầu bằng bảng chữ cái 'C:' hoặc '\'. Con trăn có chức năng tiêu chuẩn để kiểm tra xem một đường dẫn là tuyệt đối hay tương đối không?

Câu trả lời:


207

os.path.isabstrả về Truenếu đường dẫn là tuyệt đối, Falsenếu không. Tài liệu nói rằng nó hoạt động trong các cửa sổ (tôi có thể xác nhận nó hoạt động trong Linux cá nhân).

os.path.isabs(my_path)

1
Chức năng này không phải là đa nền tảng. Trên Unix os.path.isabs('c:\\')trả về Sai.
anatoly techtonik

69
Rotfl và nó sẽ trả về Sai, vì C: \\ không phải là đường dẫn tuyệt đối trong hệ thống Unix. Đường dẫn tuyệt đối trên nền tảng unix bắt đầu bằng "/", như "/ var / oblApp /", v.v. :)
Marek Lewandowski

29
@techtonik Để làm cho nó hoàn toàn rõ ràng với bất kỳ ai khác có thể tìm thấy điều này: `c: \` là một tên tệp / thư mục hoàn toàn hợp lệ trong unix. Vì vậy, nó thực sự sẽ là một đường dẫn tương đối trên một hệ thống unix. Do đó, chức năng là đa nền tảng. Bởi vì, nó đưa các đặc sản của Windows và Unix vào tài khoản.
Lemming

1
Chính xác. Nó không hoạt động giống nhau trên các nền tảng khác nhau, nó đưa ra câu trả lời chính xác cho nền tảng hiện tại.
Kevin Cox

Không trả lời câu hỏi. Để có quy tắc đa nền tảng, hãy sử dụng 'ntpath' hoặc 'posixpath' thay vì 'os.path'
Shoham

43

Và nếu những gì bạn thực sự muốn là con đường tuyệt đối, đừng bận tâm kiểm tra xem nó có phải không, chỉ cần lấy abspath:

import os

print os.path.abspath('.')

7
nó có thể không trả lời được câu hỏi ban đầu, nhưng chính xác những gì tôi đang tìm kiếm mà không nhận ra nó. cảm ơn!
mephisto


7
import os.path

os.path.isabs('/home/user')
True

os.path.isabs('user')
False

3
Tôi không nghĩ rằng dấu gạch chéo ngược sẽ hoạt động, ít nhất là nó không có trên hộp linux của tôi.
Constantinius

5

Trên thực tế tôi nghĩ rằng không có câu trả lời nào ở trên giải quyết được vấn đề thực sự: các đường dẫn đa nền tảng. Những gì os.path làm là tải phiên bản phụ thuộc hệ điều hành của thư viện 'path'. Vì vậy, giải pháp là tải rõ ràng thư viện đường dẫn (HĐH) có liên quan:

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

Đúng! Câu hỏi đặc biệt đề cập đến cả đường dẫn windows và linux! Một lớp lót nhanh hoạt động trong hầu hết các thiết lập: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel 13/03/19

4

Từ python 3.4 pathlib có sẵn.

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
Câu trả lời này thực sự hoạt động trên Windows .. Path('\tmp').is_absolute()đưa ra chính xác False, trong khi os.path.isabs('\tmp')đưa ra không chính xác True. (Một số người sẽ cho rằng đó \tmplà một đường dẫn tuyệt đối trên Windows, nhưng điều đó chỉ đúng với định nghĩa rất vô dụng về một đường dẫn tuyệt đối .)
Zbyl

0

một cách khác nếu bạn không có trong thư mục làm việc hiện tại, hơi bẩn nhưng nó hoạt động với tôi.

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

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.