Nối đường dẫn độc lập với nền tảng bằng cách sử dụng “/”, “\”?


83

Trong python tôi có các biến base_dirfilename. Tôi muốn nối chúng để có được fullpath. Nhưng dưới cửa sổ tôi nên sử dụng \và cho POSIX /.

fullpath = "%s/%s" % ( base_dir, filename ) # for Linux

Làm cách nào tôi có thể làm cho nền tảng này độc lập?




Câu trả lời:


145

Bạn muốn sử dụng os.path.join () cho việc này.

Điểm mạnh của việc sử dụng điều này thay vì nối chuỗi, v.v. là nó nhận thức được các vấn đề cụ thể của hệ điều hành khác nhau, chẳng hạn như dấu phân cách đường dẫn. Ví dụ:

import os

Trong Windows 7 :

base_dir = r'c:\bla\bing'
filename = r'data.txt'

os.path.join(base_dir, filename)
'c:\\bla\\bing\\data.txt'

Trong Linux :

base_dir = '/bla/bing'
filename = 'data.txt'

os.path.join(base_dir, filename)
'/bla/bing/data.txt'

Các os mô-đun chứa nhiều phương pháp hữu ích cho thư mục, thao tác đường dẫn và tìm hiểu thông tin cụ thể hệ điều hành, chẳng hạn như tách được sử dụng trong đường dẫn qua os.sep


26

Sử dụng os.path.join():

import os
fullpath = os.path.join(base_dir, filename)

Các os.path mô-đun chứa tất cả các phương pháp bạn nên cần cho nền tảng độc lập thao tác con đường, nhưng trong trường hợp bạn cần phải biết những gì các dấu phân cách đường dẫn là trên nền tảng hiện tại bạn có thể sử dụng os.sep.


1
nó không phải là đường dẫn đầy đủ nếu base_dirlà một đường dẫn tương đối (mặc dù OP sử dụng nó)
jfs

1
Thêm một abspath()cuộc gọi sẽ làm cho nó trở thành một đường dẫn đầy đủ nếu có bất kỳ thứ gì tương đối trong đó.
martineau

@Andrew Clark, os.sep trả về "\\" trên Windows, nhưng nó vẫn hoạt động ngay cả khi tôi sử dụng "/". Có vấn đề gì không nếu chúng ta chỉ sử dụng "/"?
multigoodverse

12

Đang tìm một câu hỏi cũ ở đây, nhưng trên Python 3.4+, bạn có thể sử dụng toán tử đường dẫn :

from pathlib import Path

# evaluates to ./src/cool-code/coolest-code.py on Mac
concatenated_path = Path("./src") / "cool-code\\coolest-code.py"

Nó có khả năng dễ đọc hơn os.path.join()nếu bạn đủ may mắn để chạy phiên bản Python gần đây. Tuy nhiên, bạn cũng đánh đổi khả năng tương thích với các phiên bản Python cũ hơn nếu bạn phải chạy mã của mình trong một môi trường cứng nhắc hoặc kế thừa.


Tôi rất thích pathlib. Tuy nhiên, nó thường không được cài đặt theo mặc định trong cài đặt Python2. Nếu bạn không muốn người dùng cũng phải cài đặt pathlib, os.path.join()thì cách đơn giản hơn để thực hiện.
Marcel Waldvogel

7
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.

1

Tôi đã tạo một lớp trợ giúp cho việc này:

import os

class u(str):
    """
        Class to deal with urls concat.
    """
    def __init__(self, url):
        self.url = str(url)

    def __add__(self, other):
        if isinstance(other, u):
            return u(os.path.join(self.url, other.url))
        else:
            return u(os.path.join(self.url, other))

    def __unicode__(self):
        return self.url

    def __repr__(self):
        return self.url

Cách sử dụng là:

    a = u("http://some/path")
    b = a + "and/some/another/path" # http://some/path/and/some/another/path

Điều này sẽ không chèn dấu gạch chéo ngược trên Windows?
Marcel Waldvogel

0

Cám ơn vì cái này. Đối với bất kỳ ai khác nhìn thấy điều này bằng cách sử dụng fbs hoặc pyinstaller và các ứng dụng bị đóng băng.

Tôi có thể sử dụng bên dưới mà bây giờ hoạt động hoàn hảo.

target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")

Tôi đã làm điều này trước đây rõ ràng là không lý tưởng.

if platform == 'Windows':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "\\" + "sqlite_example.db")

if platform == 'Linux' or 'MAC':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + "sqlite_example.db")

target_db_path = target_db
print(target_db_path)
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.