2010-04-18 33 views
9

Tôi có một số tập lệnh lấy đầu vào là tên thư mục và chương trình của tôi tạo tệp trong các thư mục đó. Đôi khi tôi muốn lấy tên cơ sở của một thư mục cho chương trình và sử dụng nó để tạo các tệp khác nhau trong thư mục. Ví dụ:Cách thanh lịch để lấy tên cơ sở của thư mục bằng Python?

# directory name given by user via command-line 
output_dir = "..." # obtained by OptParser, for example 
my_filename = output_dir + '/' + os.path.basename(output_dir) + '.my_program_output' 
# write stuff to my_filename 

Vấn đề là nếu người dùng cung cấp tên thư mục có dấu gạch chéo, thì os.path.basename sẽ trả về chuỗi trống, không phải là thứ tôi muốn. Cách thanh lịch nhất để đối phó với những vấn đề cắt giảm/dấu gạch chéo trong python là gì? Tôi biết tôi có thể tự kiểm tra dấu gạch chéo ở cuối output_dir và loại bỏ nó nếu nó ở đó, nhưng có vẻ như có một cách tốt hơn. Lanhung?

Ngoài ra, bạn có thể thêm ký tự '/' theo cách thủ công không? Ví dụ. output_dir + '/' os.path.basename() hoặc có cách tổng quát hơn để xây dựng đường dẫn không?

Cảm ơn.

Trả lời

15

Để giải quyết vấn đề "dấu gạch chéo" (và các vấn đề khác!), Hãy vệ sinh đầu vào của người dùng bằng os.path.normpath().

Để xây dựng đường dẫn, sử dụng os.path.join()

1

Xây dựng đường dẫn theo cách thủ công là ý tưởng tồi cho tính di động; nó sẽ phá vỡ trên Windows. Bạn nên sử dụng os.path.sep.

Đối với câu hỏi đầu tiên của bạn, sử dụng os.path.join là ý tưởng phù hợp.

+1

"" "nó sẽ phá vỡ trên Windows" "": slashes Bao gồm sẽ phá vỡ chỉ khi bạn ăn nó như một phần của một lệnh để ví dụ 'os.system()'; trình phân tích cú pháp lệnh DOS chỉ hiểu các dấu gạch chéo ngược. Cho ăn nó, ví dụ open() khá ổn. Tuy nhiên nếu đường dẫn được xây dựng sẽ được hiển thị cho người dùng hoặc quản trị viên Windows, hãy chuẩn bị sẵn sàng cho rất nhiều flak :-) –

7

Sử dụng os.path.join() để tạo đường dẫn. Ví dụ:

>>> import os.path 
>>> path = 'foo/bar' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
>>> path = 'foo/bar/' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
1

để xây dựng những con đường mà không cần viết chém nó là tốt hơn để sử dụng:

os.path.join(dir, subdir, file) 

nếu bạn muốn thêm dải phân cách hoặc lấy tách independly của os, sau đó sử dụng

os.sep 
+0

như OP đã nêu, vấn đề là nếu d là "mydir" thì điều này sẽ trả về một chuỗi rỗng. –

+0

@Ofri: phần tương ứng đã bị loại bỏ. – joaquin

2

Bạn nên sử dụng os.path.join() để thêm đường dẫn cùng nhau.

sử dụng

os.path.dirname(os.path.join(output_dir,'')) 

để trích xuất dirname, trong khi thêm một dấu gạch chéo nếu nó được bỏ qua.

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