Cách chia đường dẫn dos thành các thành phần của nó trong Python


153

Tôi có một biến chuỗi đại diện cho một đường dẫn dos, ví dụ:

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Tôi muốn chia chuỗi này thành:

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

Tôi đã thử sử dụng split()replace()họ chỉ xử lý dấu gạch chéo đầu tiên hoặc họ chèn số hex vào chuỗi.

Tôi cần phải chuyển đổi biến chuỗi này thành một chuỗi thô bằng cách nào đó để tôi có thể phân tích nó.

Cách tốt nhất để làm điều này là gì?

Tôi cũng nên thêm rằng nội dung của varđường dẫn mà tôi đang cố phân tích, thực sự là giá trị trả về của một truy vấn dòng lệnh. Đó không phải là dữ liệu đường dẫn mà tôi tự tạo ra. Nó được lưu trữ trong một tệp và công cụ dòng lệnh sẽ không thoát khỏi dấu gạch chéo ngược.


6
Khi bạn xem lại những câu trả lời này, hãy nhớ rằng os.path.splitnó không hiệu quả với bạn vì bạn không thoát khỏi chuỗi đó đúng cách.
Jed Smith

Bạn cần thoát khỏi chuỗi hoặc sử dụng chuỗi thô: r"d:\stuff\morestuff\furtherdown\THEFILE.txt"để ngăn chặn những thứ như \sbị hiểu sai.
smci

Câu trả lời:


164

Tôi đã bị cắn rất nhiều lần bởi những người viết các chức năng thay đổi đường dẫn của chính họ và hiểu sai. Dấu cách, dấu gạch chéo, dấu gạch chéo ngược, dấu hai chấm - khả năng gây nhầm lẫn không phải là vô tận, nhưng dù sao cũng có thể dễ dàng mắc lỗi. Vì vậy, tôi là một người gắn bó cho việc sử dụng os.pathvà giới thiệu nó trên cơ sở đó.

(Tuy nhiên, con đường dẫn đến đức hạnh không phải là con đường dễ dàng nhất, và nhiều người khi tìm thấy điều này bị cám dỗ đi một con đường trơn trượt đến chết tiệt. Họ sẽ không nhận ra cho đến một ngày mọi thứ sụp đổ, và họ - hoặc , nhiều khả năng, một người khác - phải tìm ra lý do tại sao mọi thứ đã sai, và hóa ra ai đó đã tạo một tên tệp trộn lẫn dấu gạch chéo và dấu gạch chéo ngược - và một số người cho rằng câu trả lời là "không làm điều đó". Không phải là bất kỳ ai trong số những người này. Ngoại trừ người đã trộn lẫn dấu gạch chéo và dấu gạch chéo ngược - bạn có thể là họ nếu bạn muốn.)

Bạn có thể lấy ổ đĩa và đường dẫn + tệp như thế này:

drive, path_and_file = os.path.splitdrive(path)

Nhận đường dẫn và tệp:

path, file = os.path.split(path_and_file)

Lấy tên thư mục riêng lẻ không đặc biệt thuận tiện, nhưng đó là loại khó chịu trung thực trung thực làm tăng niềm vui sau này khi tìm thấy thứ gì đó thực sự hoạt động tốt:

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(Điều này xuất hiện "\"khi bắt đầu foldersnếu đường dẫn ban đầu là tuyệt đối. Bạn có thể mất một chút mã nếu bạn không muốn điều đó.)


@brone - Tôi thích sử dụng giải pháp này hơn là phải lo lắng về việc thoát khỏi dấu gạch chéo ngược. cảm ơn!
BeeBand

1
Tôi rất vui khi được chứng minh là sai nhưng dường như tôi đề xuất giải pháp không hoạt động nếu một đường dẫn như "C: \ usr \ rs0 \ my0 \ in111102.log" này được sử dụng (trừ khi đầu vào ban đầu là một chuỗi thô )?
shearichard

1
Có vẻ như điều này sẽ không phân chia một đường dẫn đúng nếu nó chỉ chứa một thư mục trong OSX, chẳng hạn như "/ path / to / my / thư mục /", để đạt được rằng bạn muốn thêm hai dòng này vào đầu: if path.endswith("/"):path = path[:-1].
Kevin London

1
Tôi thích giải pháp của @Tompa
jaycode

1
Tôi đồng tình với jaycode : Tompa của giải phápcác phương pháp kinh điển và cần phải có được câu trả lời được chấp nhận. Sự thay thế quá phức tạp, không hiệu quả và dễ bị lỗi này không vượt qua được mã sản xuất. Không lý do hợp lý để cố gắng (... và thất bại, tất nhiên) để lặp lại phân tách các tên đường dẫn khi tách chuỗi đơn giản thành công chỉ với một dòng mã.
Cecil Curry

287

tôi sẽ làm

import os
path = os.path.normpath(path)
path.split(os.sep)

Đầu tiên, chuẩn hóa chuỗi đường dẫn thành một chuỗi thích hợp cho HĐH. Sau đó, os.sepphải an toàn để sử dụng như một dấu phân cách trong phân chia hàm chuỗi.


25
Câu trả lời đúng: nó đã xuất hiện . Các giải pháp kinh điển là đơn giản nhất, tất nhiên. Hãy chứng kiến! Đối với nó là thanh lịch và contumely và không có trường hợp cạnh không thể vượt qua.
Cecil Curry

20
Như một lớp lót,os.path.normpath(a_path).split(os.path.sep)
Daniel Farrell

2
Điều này dường như không hoạt động cho path = root. Trong trường hợp đó, kết quả của path.split là ['', '']. Trong thực tế nói chung, giải pháp split () này cung cấp một thư mục ngoài cùng bên trái với tên chuỗi rỗng (có thể được thay thế bằng dấu gạch chéo thích hợp). Vấn đề cốt lõi là một dấu gạch chéo (tiến hoặc lùi tùy thuộc vào HĐH) là tên của thư mục gốc, trong khi ở nơi khác trong đường dẫn, nó là dấu phân cách .
gwideman

2
Nó sẽ hoạt động tốt hơn với một lstrip sau đó? os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
Vidar

1
@ user60561 Đó là bởi vì trên Linux, dấu gạch chéo ngược là ký tự được phép trong tên tệp, trong khi trên Windows, dấu gạch chéo về phía trước thì không. Đó là lý do tại sao trên Windows, normpathsẽ nhận ra dấu gạch chéo về phía trước như một dấu phân cách. Trên Linux, normpathđơn giản sẽ giả sử rằng bạn có một thư mục được gọi \1\2và một tệp hoặc thư mục bên trong nó được gọi 3.
Vojislav Stojkovic

81

Bạn chỉ có thể sử dụng phương pháp Pythonic nhất (IMHO):

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list

Mà sẽ cung cấp cho bạn:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Manh mối ở đây là sử dụng os.septhay vì '\\'hoặc '/', vì điều này làm cho hệ thống độc lập.

Để xóa dấu hai chấm khỏi ký tự ổ đĩa (mặc dù tôi không thấy bất kỳ lý do nào khiến bạn muốn làm điều đó), bạn có thể viết:

path_list[0] = path_list[0][0]

22
Điều này hoạt động some times. Những lần khác (ít nhất là trên windows) bạn sẽ tìm thấy những con đường trông như thế folder\folder2\folder3/file.txt. Trước tiên, tốt hơn là bình thường hóa (os.path.normpath) đường dẫn và sau đó phân tách nó.
vikki

7
Câu trả lời này đã gần như ở đó. Như vikki gợi ý, việc không bình thường hóa tên đường dẫn trước khi chia tách chuỗi phép thuật cho các trường hợp cạnh phổ biến (ví dụ /foo//bar:). Xem câu trả lời của Tompa cho một giải pháp mạnh mẽ hơn.
Cecil Curry

62

Trong Python> = 3,4, điều này đã trở nên đơn giản hơn nhiều. Bây giờ bạn có thể sử dụng pathlib.Path.partsđể có được tất cả các phần của một con đường.

Thí dụ:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

Trên bản cài đặt Windows 3 của Python 3, điều này sẽ cho rằng bạn đang làm việc với các đường dẫn Windows và trên * nix, nó sẽ cho rằng bạn đang làm việc với các đường dẫn posix. Đây thường là những gì bạn muốn, nhưng nếu không, bạn có thể sử dụng các lớp pathlib.PurePosixPathhoặc pathlib.PureWindowsPathkhi cần:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

Chỉnh sửa: Ngoài ra còn có một backport cho python 2: pathlib2


3
Path.parts là những gì tôi luôn mong muốn, nhưng tôi chưa bao giờ biết nó tồn tại cho đến ngày hôm nay.
JamEnergy

Tại sao điều này không được bao bọc xung quanh một chức năng python bản địa tốt đẹp?
Eduardo Pignatelli

2
Đó là câu trả lời!
nayriz

11

Vấn đề ở đây bắt đầu từ cách bạn tạo chuỗi ở vị trí đầu tiên.

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Thực hiện theo cách này, Python đang cố gắng trường hợp đặc biệt sau đây: \s, \m, \f, và \T. Trong trường hợp của bạn, \fđang được coi là một nguồn cấp dữ liệu mẫu (0x0C) trong khi các dấu gạch chéo ngược khác được xử lý chính xác. Những gì bạn cần làm là một trong những điều sau:

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary

Sau đó, khi bạn chia một trong hai thứ này, bạn sẽ nhận được kết quả bạn muốn.


@W. Craig Trader - cảm ơn, nhưng con đường này không phải là con đường mà tôi tự tạo ra - nó trở lại với tôi từ một chương trình khác và tôi phải lưu trữ dữ liệu này trong một biến. Tôi không chắc chắn làm thế nào để chuyển đổi dữ liệu được lưu trữ trong một biến thành "văn bản thô".
BeeBand

Không có thứ gọi là "văn bản thô" ... đó chỉ là cách bạn thể hiện nó trong nguồn. Hoặc là thêm r "" vào chuỗi hoặc chuyển qua .replace ('\\', '/')
Marco Mariani

@BeeBand, làm thế nào để bạn lấy lại dữ liệu từ chương trình khác? Bạn đang đọc nó từ một tập tin, một đường ống, một ổ cắm? Nếu vậy, thì bạn không cần phải làm bất cứ điều gì lạ mắt; lý do duy nhất để nhân đôi dấu gạch chéo ngược hoặc sử dụng chuỗi thô là đặt các hằng chuỗi vào mã Python. Mặt khác, nếu chương trình khác đang tạo dấu gạch chéo kép, thì bạn muốn xóa nó trước khi chia đường dẫn của mình.
Craig Trader

@W. Craig Trader - tôi đang đọc nó từ một tập tin, được viết bởi một chương trình khác. Tôi không thể có được split()hoặc replace()để làm việc vì một số lý do - tôi tiếp tục nhận được các giá trị hex. Mặc dù bạn đúng, tôi nghĩ rằng tôi đã sủa sai cây với ý tưởng chuỗi thô - tôi nghĩ rằng tôi đang sử dụng split()không chính xác. Bởi vì tôi đã thử một số giải pháp này bằng cách sử dụng split()và chúng hiện đang làm việc cho tôi.
BeeBand

10

Đối với một giải pháp ngắn gọn hơn, hãy xem xét những điều sau đây:

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]

Đây là giải pháp yêu thích của tôi cho vấn đề này. Rất đẹp.
Will Moore

1
Điều này không hoạt động nếu đường dẫn kết thúc bằng /. Ngoài ra, cung cấp cho bạn một chuỗi trống ở đầu danh sách nếu đường dẫn của bạn bắt đầu bằng/
Sorig

4

Tôi thực sự không thể đóng góp một câu trả lời thực sự cho câu hỏi này (vì tôi đến đây với hy vọng tìm thấy một mình), nhưng với tôi số cách tiếp cận khác nhau và tất cả các cảnh báo được đề cập là chỉ số chắc chắn nhất mà mô-đun os.path của Python rất cần điều này như một chức năng tích hợp.


4

Các cách chức năng, với một máy phát điện .

def split(path):
    (drive, head) = os.path.splitdrive(path)
    while (head != os.sep):
        (head, tail) = os.path.split(head)
        yield tail

Trong hành động:

>>> print([x for x in split(os.path.normpath('/path/to/filename'))])
['filename', 'to', 'path']

3

Nó hoạt động với tôi:

>>> a=r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
>>> a.split("\\")
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Chắc chắn bạn có thể cần phải loại bỏ dấu hai chấm từ thành phần đầu tiên, nhưng việc giữ nó làm cho nó có thể lắp ráp lại đường dẫn.

Công cụ rsửa đổi đánh dấu chuỗi ký tự là "thô"; chú ý cách dấu gạch chéo ngược không được nhân đôi.


@unwind - rphía trước chuỗi của bạn, điều đó đề cập đến điều gì?
BeeBand

2
r có nghĩa là chuỗi thô - nó tự động thoát các \ ký tự. Nó rất hữu ích để sử dụng bất cứ khi nào bạn đang làm đường dẫn.
Wayne Werner

1
@BeeBand: bạn không cần quan tâm; r "" chỉ là một vấn đề quan trọng trong quá trình biên dịch / phân tích mã, nó không phải là thứ trở thành thuộc tính của chuỗi khi được phân tích cú pháp. Nó chỉ có nghĩa là "đây là một chuỗi ký tự, nhưng không diễn giải bất kỳ dấu gạch chéo ngược nào có ý nghĩa khác ngoài dấu gạch chéo ngược".
thư giãn

3
Tôi nghĩ có thể hữu ích khi đề cập đến bạn trừ đi việc làm mơ hồ hơn bằng cách sử dụng a.split (os.sep) thay vì mã hóa cứng?
Tim McJilton

4
Tôi phải đánh giá thấp bạn vì đã bỏ lỡ một cơ hội để giải thích os.path.splitos.pathsep, xem xét cả hai thứ đó đều dễ mang hơn nhiều so với những gì bạn đã viết. Nó có thể không quan trọng với OP bây giờ, nhưng nó sẽ khi anh ấy viết một cái gì đó cần phải di chuyển nền tảng.
Jed Smith

3

Các công cụ về mypath.split("\\")sẽ được thể hiện tốt hơn như mypath.split(os.sep). seplà dấu phân cách đường dẫn cho nền tảng cụ thể của bạn (ví dụ: \cho Windows, /cho Unix, v.v.) và bản dựng Python biết nên sử dụng cái nào. Nếu bạn sử dụng sep, thì mã của bạn sẽ là bất khả tri.


1
Hoặc os.path.split. Bạn muốn cẩn thận os.pathsep, vì đó là :phiên bản Python của tôi trong OS X (và os.path.splitxử lý đúng cách /).
Jed Smith

4
Bạn có nghĩa là os.sep, không phải os.pathsep. Làm theo sự khôn ngoan trong các os.septài liệu: Lưu ý rằng việc biết điều này là không đủ để có thể phân tích hoặc ghép các tên đường dẫn - sử dụng os.path.split () và os.path.join ().
Jon-Eric

1

re.split () có thể giúp thêm một chút sau đó chuỗi.split ()

import re    
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
re.split( r'[\\/]', var )
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Nếu bạn cũng muốn hỗ trợ các đường dẫn Linux và Mac, chỉ cần thêm bộ lọc (Không có kết quả), do đó, nó sẽ xóa '' không mong muốn khỏi split () vì các đường dẫn của chúng bắt đầu bằng '/' hoặc '//'. ví dụ '// mount / ...' hoặc '/ var / tmp /'

import re    
var = "/var/stuff/morestuff/furtherdown/THEFILE.txt"
result = re.split( r'[\\/]', var )
filter( None, result )
['var', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

1

Bạn có thể đệ quy os.path.splitchuỗi

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [p]

Kiểm tra điều này với một số chuỗi đường dẫn và gắn lại đường dẫn với os.path.join

>>> for path in [
...         r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
...         '/path/to/file.txt',
...         'relative/path/to/file.txt',
...         r'C:\path\to\file.txt',
...         r'\\host\share\path\to\file.txt',
...     ]:
...     print parts(path), os.path.join(*parts(path))
... 
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt

Phần tử đầu tiên của danh sách có thể cần được xử lý khác nhau tùy thuộc vào cách bạn muốn xử lý ký tự ổ đĩa, đường dẫn UNC và đường dẫn tuyệt đối và tương đối. Thay đổi cái cuối cùng [p]để [os.path.splitdrive(p)]buộc vấn đề bằng cách tách ký tự ổ đĩa và thư mục gốc thành một bộ.

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [os.path.splitdrive(p)]

[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']

Chỉnh sửa: Tôi đã nhận ra rằng câu trả lời này rất giống với câu trả lời ở trên của user1556435 . Tôi đang để lại câu trả lời của mình vì việc xử lý thành phần ổ đĩa của đường dẫn là khác nhau.


0

Giống như những người khác đã giải thích - vấn đề của bạn bắt nguồn từ việc sử dụng \, đó là ký tự thoát trong chuỗi ký tự / hằng. OTOH, nếu bạn có chuỗi đường dẫn tệp đó từ một nguồn khác (đọc từ tệp, bảng điều khiển hoặc được trả về bởi chức năng os) - sẽ không có vấn đề gì khi chia tách trên '\' hoặc r '\'.

Và giống như những người khác đề xuất, nếu bạn muốn sử dụng \theo nghĩa đen của chương trình, bạn phải sao chép nó \\hoặc toàn bộ nghĩa đen phải được thêm tiền tố r, như vậy r'lite\ral'hoặc r"lite\ral"để tránh trình phân tích cú pháp chuyển đổi ký tự đó \rthành ký tự CR (trả về vận chuyển).

Mặc dù vậy, có một cách nữa - chỉ cần không sử dụng \tên đường dẫn dấu gạch chéo ngược trong mã của bạn! Từ thế kỷ trước, Windows nhận ra và hoạt động tốt với các tên đường dẫn sử dụng dấu gạch chéo chuyển tiếp làm dấu phân cách thư mục /! Bằng cách nào đó không nhiều người biết điều đó .. nhưng nó hoạt động:

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Nhân tiện, điều này sẽ làm cho mã của bạn hoạt động trên Unix, Windows và Mac ... bởi vì tất cả chúng đều sử dụng /như dấu tách thư mục ... ngay cả khi bạn không muốn sử dụng các hằng số mô-đun được xác định trước os.


Thật không may, dữ liệu đang được trả về cho tôi từ một chương trình khác mà tôi chạy từ tập lệnh python của mình. Tôi không có bất kỳ quyền kiểm soát nào về việc nên sử dụng '\' hay '/' - đó là chương trình của bên thứ ba xác định điều này (có thể trên cơ sở nền tảng).
BeeBand

@BeeBand: Ah, sau đó bạn sẽ không gặp phải vấn đề bạn gặp phải trong quá trình thử nghiệm, khi bạn cung cấp chuỗi dưới dạng chữ trong chương trình của mình. Hoặc bạn có thể thực hiện hack ác sau đây sau khi nhận được đường dẫn: var = var.replace('\\','/')- thay thế \ bằng / và chỉ tiếp tục làm việc với các dấu gạch chéo về phía trước :)
Nas Banov

đó thực sự là một hack ác: o)
BeeBand

@BeeBand: đó là lý do tại sao tôi cảnh báo. Khi tôi nói điều gì đó là xấu xa, tôi không nhất thiết có nghĩa là nó không bao giờ nên được sử dụng - nhưng người ta nên rất nhiều nhận thức được lý do tại sao họ đang sử dụng nó và cảnh báo hậu quả ngoài ý muốn. Trong trường hợp này, một hậu quả rất khó xảy ra là nếu điều này được sử dụng trên hệ thống tệp Unix với `` sử dụng trong tên tệp hoặc thư mục (nó thực sự khó nhưng có thể) - mã này sẽ 'phá vỡ'
Nas Banov

0

Giả sử bạn có một tệp filedata.txtcó nội dung:

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

Bạn có thể đọc và phân chia đường dẫn tệp:

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']

Điều này thực sự hoạt động, cảm ơn! Nhưng tôi đã chọn giải pháp của brone vì tôi không muốn lo lắng về việc thoát khỏi dấu gạch chéo ngược.
BeeBand

9
Không phải pythonic vì nó phụ thuộc vào hệ thống tập tin.
jb.

0

Tôi sử dụng như sau vì nó sử dụng hàm os.path.basename, nó không thêm bất kỳ dấu gạch chéo nào vào danh sách trả về. Nó cũng hoạt động với các dấu gạch chéo của bất kỳ nền tảng nào: tức là cửa sổ \ hoặc unix's /. Và hơn nữa, nó không thêm \ \ \ mà windows sử dụng cho đường dẫn máy chủ :)

def SplitPath( split_path ):
    pathSplit_lst   = []
    while os.path.basename(split_path):
        pathSplit_lst.append( os.path.basename(split_path) )
        split_path = os.path.dirname(split_path)
    pathSplit_lst.reverse()
    return pathSplit_lst

Vì vậy, đối với '\ \ \ máy chủ \ thư mục1 \ thư mục2 \ thư mục3 \ thư mục4'

bạn lấy

['Máy chủ', 'thư mục1', 'thư mục2', 'thư mục3', 'thư mục4']


1
Điều đó không tuân theo bất biến rằng việc chuyển kết quả của bạn os.path.join()sẽ trả về chuỗi gốc. Tôi muốn nói đầu ra chính xác cho đầu vào ví dụ của bạn là [r'\\','server','folder1','folder2','folder3','folder4']. Tức là những gì os.path.split()không.
Jon-Eric

0

Tôi thực sự không chắc chắn nếu điều này trả lời đầy đủ câu hỏi, nhưng tôi đã có một thời gian vui vẻ khi viết hàm nhỏ này giữ một ngăn xếp, dính vào các thao tác dựa trên os.path và trả về danh sách / ngăn xếp các mục.

  9 def components(path):
 10     ret = []
 11     while len(path) > 0:
 12         path, crust = split(path)
 13         ret.insert(0, crust)
 14
 15     return ret
 16

0

Dòng mã dưới đây có thể xử lý:

  1. C: / đường dẫn / đường dẫn
  2. C: // đường dẫn // đường dẫn
  3. C: \ path \ path
  4. C: \ path \ path

đường dẫn = re.split (r '[/// \]', đường dẫn)


0

Một đệ quy cho vui.

Không phải là câu trả lời tao nhã nhất, nhưng nên hoạt động ở mọi nơi:

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]

thực sự xin lỗi Nên đọc kỹ câu hỏi ... một con đường 'dos'.
DuGNu

-1

sử dụng ntpath.split()


khi tôi sử dụng os.path.split () tôi nhận được, ( d:\\stuff, morestuff\x0curtherdown\thefile.mux)
BeeBand

Như BeeBand đã chỉ ra, os.path.split () thực sự không làm điều mong muốn.
thư giãn

xin lỗi tôi chỉ nhận ra os.path chỉ hoạt động tùy thuộc vào os của bạn. ntpath sẽ phân tích đường dẫn dos.
deft_code

ngay cả với ntpath tôi vẫn nhận đượcd:\\stuff, morestuff\x0curtherdown\thefile.mux
BeeBand

2
@BeeBand: bạn gặp vấn đề với việc thoát chuỗi của mình. '\x0c'là nhân vật thức ăn mẫu. Cách tạo ký tự nguồn cấp biểu mẫu là '\ f'. Nếu bạn thực sự muốn chuỗi ký tự '\ f', bạn có hai tùy chọn: '\\f'hoặc r'\f'.
deft_code
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.