2009-07-11 46 views
11
>>> os.path.basename('http://example.com/file.txt') 
'file.txt' 

.. và tôi nghĩ os.path.* chỉ hoạt động trên đường dẫn cục bộ chứ không phải URL? Lưu ý rằng ví dụ trên đã được chạy trên Windows quá .. với kết quả tương tự.os.path.basename hoạt động với URL, tại sao?

+0

Làm rõ: Tôi không hỏi về/tại sao/nó hoạt động (mà mã nguồn rõ ràng là cách để đi); thay vì tôi hỏi tại sao nó hoạt động (theo chính sách - đặc biệt là trên Windows '\' là dấu phân cách đường dẫn) –

+1

Microsoft OSes chấp nhận '/' forward slash như một dấu tách đường dẫn 'Dos 2', mặc dù từ' Dos 3' sử dụng '/' đã bị vô hiệu hóa bởi lệnh shell (nó không còn nữa) bởi vì nó xung đột với ký hiệu cờ tùy chọn dòng lệnh. Do đó, việc triển khai thực hiện rất đơn giản là không nhận thức được tính hợp lệ của '/'. Python rõ ràng là. Ngoài ra, bạn không thể sử dụng dấu gạch chéo chuyển tiếp với tiền tố '" \\? \ "'. nguồn http://bytes.com/topic/python/answers/23123-when-did-windows-start-accepting-forward-slash-path-separator và http://msdn.microsoft.com/en-us/library /aa365247(VS.85).aspx#paths – n611x007

Trả lời

17

Trong thực tế nhiều chức năng của os.path là chức năng thao tác chỉ chuỗi (mà chỉ xảy ra để thể đặc biệt hữu ích cho con đường thao túng) - và vì đó là vô hại và thỉnh thoảng tiện dụng, trong khi nói chuyện chính thức "không chính xác", tôi nghi ngờ điều này sẽ thay đổi bất cứ lúc nào sớm - để biết thêm chi tiết, sử dụng đơn giản một-liner sau tại dấu nhắc shell/lệnh:

$ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]" 

Hoặc, cho Python 3:

$ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])" 
+4

Tôi phải nói rằng một lớp lót rất ấn tượng. – sunqiang

+0

trên cửa sổ: s/'/ "/ g – ars

+0

@ars, tx", thực sự tốt hơn và đa nền tảng nên tôi đã chỉnh sửa. @sunqiang, vui vì bạn thích nó! -) –

3

Trên cửa sổ, nhìn vào mã nguồn: C: \ Python25 \ Lib \ ntpath.py

def basename(p): 
    """Returns the final component of a pathname""" 
    return split(p)[1] 

os.path.split (trong cùng một tập tin) chỉ chia "\" (và sth. khác)

+0

đang sử dụng 'os.path.basename' trên URL theo cách pythonic để trích xuất loại thông tin này từ chúng?hoặc tôi nên sử dụng 'urlpare.urparse ('') .path' thay thế? – n611x007

+1

@naxa xin lỗi vì sự phản hồi chậm trễ, tôi không thể nói nó là pythonic, nghĩ rằng nó tìm đường đi/filepath.Base "hỗ trợ" url quá. Tôi thích urlparse cho xử lý url. – sunqiang

2

Sử dụng nguồn Luke:


def basename(p): 
    """Returns the final component of a pathname""" 
    i = p.rfind('/') + 1 
    return p[i:] 

chỉnh sửa (đáp lại rõ):

Nó hoạt động cho các URL một cách tình cờ, đúng vậy. Do đó, việc khai thác hành vi của nó có thể được coi là mã do một số người sử dụng.

Đang cố gắng để "sửa chữa" nó (kiểm tra xem đường truyền không phải là url) cũng bất ngờ khó

www.google.com/test.php 
[email protected]/12 
./src/bin/doc/goto.c 

đang ở cùng thời điểm đó tên đường dẫn chính xác và URL (tương đối), như vậy là http:/hello.txt (một/, và chỉ trên Linux, và nó kinda stupid :)). Bạn có thể "sửa" nó cho các url tuyệt đối nhưng những cái tương đối sẽ vẫn hoạt động. Xử lý một trường hợp đặc biệt khác nhau là một không lớn trong thế giới python.

Nói tóm lại: nhập khẩu này

0

Tại sao? Bởi vì nó hữu ích cho việc phân tích cú pháp URL cũng như đường dẫn tệp cục bộ. Tại sao không?

+0

Vì nó nằm trong mô-đun os.path, và đó không phải là một đường dẫn được hiểu bởi hệ điều hành nếu bạn đang chạy các cửa sổ; đường dẫn seperator là khác nhau. Tôi tin rằng/là một ký tự tên tệp hợp lệ trong Windows, điều này sẽ làm cho một URL có tên là falename hợp lệ và hành vi này không chính xác. Tôi không phải là người dùng Windows, vì vậy một số hoặc tất cả, nhận xét này có thể là vô nghĩa. – SpoonMeiser

+1

@SpoonMeiser, việc triển khai thư viện C của Microsoft thực sự cho phép bạn sử dụng/như một giải pháp thay thế hợp lệ cho \ (bản thân hệ điều hành, ở cấp độ syscall/Win32API, đã lên đến một điểm, nhưng tôi nghĩ nó không phải từ vài năm trước ;-). –

+0

@ Alex Martelli, Nếu điều đó vẫn đúng, thì điều đó sẽ có ý nghĩa. – SpoonMeiser

1

forw ard slash cũng là một dấu phân cách đường dẫn được chấp nhận trong Windows.

Nó chỉ đơn thuần là dòng lệnh không chấp nhận đường dẫn bắt đầu bằng/bởi vì ký tự đó được dành riêng cho chuyển mạch args.

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