2015-05-13 12 views
5

Tôi đang cố gắng chuyển đổi Đường dẫn Mac thành đường dẫn POSIX bằng Python. Tôi muốn chuyển đổi một cái gì đó như thế này:Chuyển đổi đường dẫn mac thành posix trong python

'Main HD:Users:sasha:Documents:SomeText.txt' 

này:

'/Users/sasha/Documents/SomeText.txt' 

Tôi biết tôi chỉ có thể chia chuỗi thành một danh sách và sau đó nối lại nó với các dấu phân cách chính xác. Nhưng tôi tin rằng phải có một giải pháp thanh lịch hơn nhiều mà tôi đang thiếu, có thể liên quan đến các mô-đun python "macpath" hoặc "os.path". Tuy nhiên, tôi đã không thể tìm ra một chức năng trong các mô-đun này sẽ thực hiện thủ thuật chuyển đổi giữa hai định dạng.

Một vấn đề khác của giải pháp thao tác chuỗi đơn giản là nếu tôi có nhiều HD, thì giải pháp đơn giản sẽ không hoạt động. Ví dụ:

Nếu bạn có một con đường như:

'Extra HD:SomeFolder:SomeOtherText.txt' 

chúng tôi muốn rằng để được chuyển đổi sang:

'/Volumes/Extra HD/SomeFolder/SomeOtherText.txt' 

Không:

'/SomeFolder/SomeOtherText.txt' 
+1

Chỉ vì tò mò, đường dẫn như 'Main HD: Users: sasha: Documents: SomeText.txt' đến từ đâu? Tôi đang sử dụng OSX Mavericks nhưng không bao giờ thấy rằng trước khi – number5

+0

Đó là cách trước OS-X chỉ định đường dẫn thư mục. Tên đĩa cứng xuất hiện đầu tiên, với một ':' dẫn đầu chỉ ra một đường dẫn tương đối. – chepner

+0

Làm cách nào để bạn nhận được đường dẫn này? Applescript? – duskwuff

Trả lời

2

Bạn có thể sử dụng Mô-đun Pythons subprocess cho điều này:

#!/usr/bin/python 

import subprocess 

def asExec(ascript): 

    osa = subprocess.Popen(['osascript', '-'], 
          stdin=subprocess.PIPE, 
          stdout=subprocess.PIPE) 
    return osa.communicate(ascript)[0] 

def asConv(astr): 

    astr = astr.replace('"', '" & quote & "') 
    return '"{}"'.format(astr) 

def aScript(aspath): 

    ascript = ''' 
    set posixPath to POSIX path of {0} 
    '''.format(asConv(aspath)) 
    return ascript 

aliasPath = "Main HD:Users:sasha:Documents:SomeText.txt" 
print(asExec(aScript(aliasPath))) 

Kết quả:

/Main HD/Users/sasha/Documents/SomeText.txt

+1

Điều này hoạt động đúng với tôi NẾU tên ổ đĩa thực sự là một ổ đĩa được gắn kết. Đó là, "Macintosh HD: một số: path" -> "/ some/path", "Volume khác: some: path" -> "/ Volumes/Volume khác/some/path". Nhưng nó thất bại nếu khối lượng không tồn tại, như trong "Khối lượng không tồn tại: một số: đường dẫn" -> "/ Nonexistent Volume/some/path". –

+1

Ok, điều này hoạt động và thanh lịch. cảm ơn bạn I'L'I – alexvicegrab

+0

@GordonDavisson: Tôi có thể sử dụng bất kỳ thứ gì (ví dụ: 'iasalath = "foo: bar: baz" ') và nó trả về'/foo/bar/baz', vì vậy không rõ tại sao nó không thành công bạn. –

1

Không có bất kỳ phương pháp trong các thư viện chuẩn. os.path cung cấp các phương thức thao tác đường dẫn cho hệ điều hành hiện tại và không có phương pháp để chuyển đổi kiểu đường dẫn hoặc thay đổi dấu phân cách. Các mô-đun thao tác đường dẫn os cụ thể như macpath, posixpathntpath không chứa các phương thức để chuyển đổi các ký hiệu phân tách đường dẫn và các loại tương tự. (Nguồn: os.path docs)

Như vậy, tôi nghĩ việc thay thế dấu phân cách bằng thao tác chuỗi là giải pháp hợp lý cho vấn đề này.

Các vấn đề liên quan