2013-05-09 27 views
13

Tôi đang cố gắng thực hiện một số xử lý địa lý. Nhiệm vụ của tôi là định vị tất cả các shapefile trong một thư mục, và sau đó tìm tên đường dẫn đầy đủ cho shapefile đó trong thư mục. Tôi có thể lấy tên của shapefile, nhưng tôi không biết cách lấy tên đường dẫn đầy đủ cho shapefile đó.Cần đường dẫn cho các tệp cụ thể bằng os.walk()

shpfiles = [] 
for path, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp") == True: 
      shpfiles.append[x] 

Trả lời

38

os.walk cung cấp cho bạn đường dẫn đến thư mục như giá trị đầu tiên trong vòng lặp, chỉ cần sử dụng os.path.join() để tạo ra đầy đủ filename:

shpfiles = [] 
for dirpath, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp"): 
      shpfiles.append(os.path.join(dirpath, x)) 

tôi đổi tên path trong vòng lặp để dirpath để không mâu thuẫn với biến số path mà bạn đã chuyển đến os.walk().

Lưu ý rằng bạn không cần phải kiểm tra nếu kết quả của .endswith() == True; if đã làm điều đó cho bạn, phần == True là hoàn toàn dư thừa.

Bạn có thể sử dụng .extend() và một biểu thức máy phát điện để làm cho đoạn code trên một chút nhỏ gọn hơn:

shpfiles = [] 
for dirpath, subdirs, files in os.walk(path): 
    shpfiles.extend(os.path.join(dirpath, x) for x in files if x.endswith(".shp")) 

hoặc thậm chí là một danh sách hiểu:

shpfiles = [os.path.join(d, x) 
      for d, dirs, files in os.walk(path) 
      for x in files if x.endswith(".shp")] 
+0

Cảm ơn bạn đã giúp đỡ của bạn! Tôi đoán điều đó dễ hơn tôi tưởng. – Schack

-1

vẻ os.path.abspath(finename) sẽ làm việc. Vui lòng thử.

shpfiles = [] 
for path, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp") == True: 
      shpfiles.append(os.path.join(path, x)) 
+3

Không, không. 'abspath' sẽ căn cứ vào tên tệp của * thư mục làm việc hiện tại *, có thể là một đường dẫn hoàn toàn khác hoàn toàn. –

+0

@Martijn: vâng bạn đúng. – gsmaker

-1

Tại sao không import glob?

import glob 

print(glob.glob('F:\OTHERS\PHOTOS\Panama\\mai13*\\*.jpg')) 

và tôi nhận được tất cả các jpeg tôi muốn, với đường dẫn tuyệt đối

>>> 
['F:\\OTHERS\\PHOTOS\\Panama\\mai13\\03052013271.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013272.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013273.jpg'] 
+2

'glob()' chỉ hỗ trợ độ sâu cố định của các thư mục con, 'os.walk()' hỗ trợ độ sâu tùy ý. Xem [Làm thế nào tôi có thể tìm kiếm các thư mục con bằng cách sử dụng mô-đun glob.glob trong Python?] (Http://stackoverflow.com/questions/14798220/14798263#14798263) –

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