2011-11-30 39 views
6

Tôi muốn resursively đổi tên thư mục bằng cách thay đổi các ký tự cuối cùng thành chữ thường (nếu nó là một lá thư)Làm thế nào để lặp đệ quy thông qua một cấu trúc file và đổi tên thư mục trong python

Tôi đã làm điều này với sự giúp đỡ của tôi các bài đăng trước đó (xin lỗi vì đã đăng và không nhận ra câu trả lời)

Mã này hoạt động cho Tệp, nhưng làm cách nào để tôi cũng có thể điều chỉnh cho thư mục?

import fnmatch 
import os 


def listFiles(dir): 
    rootdir = dir 
    for root, subFolders, files in os.walk(rootdir): 
     for file in files: 
      yield os.path.join(root,file) 
    return 


for f in listFiles(r"N:\Sonstiges\geoserver\IM_Topo\GIS\MAPTILEIMAGES_0\tiles_2"): 
    if f[-5].isalpha(): 
     os.rename(f,f[:-5]+f[-5].lower() + ".JPG") 
     print "Renamed " + "---to---" + f[:-5]+f[-5].lower() + ".JPG" 
+0

Hãy cố gắng tránh thêm ý kiến ​​không liên quan và chữ ký để viết. –

+1

Một vấn đề mà bạn có thể gặp phải là đổi tên thư mục trong khi bạn đang đi bộ trên cây có thể khiến cho quá trình di chuyển thất bại (vì bạn có thể thử đi vào một thư mục đã được đổi tên). Vì vậy, những gì bạn có thể muốn làm là làm cho một danh sách của tất cả các thư mục cần phải đổi tên, và có một vòng lặp riêng biệt sau khi đi bộ để đổi tên những người. – kindall

Trả lời

7

Vấn đề là mặc định là os.walk là topdown. Nếu bạn cố gắng đổi tên các thư mục trong khi duyệt ngang, kết quả sẽ không thể đoán trước được.

Hãy thử thiết lập os.walk để đi từ dưới lên:

for root, subFolders, files in os.walk(rootdir,topdown=False): 

Sửa

Một vấn đề khác bạn có được listFiles() đang trở lại, tốt, tập tin không phải thư mục.

này (chưa được kiểm tra) sub lợi nhuận danh bạ từ dưới lên:

def listDirs(dir): 
    for root, subFolders, files in os.walk(dir, topdown=False): 
     for folder in subFolders: 
      yield os.path.join(root,folder) 
    return 
+0

Cảm ơn lời khuyên. Tôi không biết làm thế nào tôi có thể thay đổi mã để đổi tên chỉ các thư mục và không phải là các tập tin mặc dù. Tôi đã thay thế listFiles bằng listDir nhưng nó không hoạt động. Chúc mừng, Rob –

+0

Sử dụng 'thư mục con' thay vì' tệp'. 'files' là một danh sách các tập tin,' subFolders' là một danh sách các thư mục con. – Robin

+0

Tuyệt vời --- cảm ơn sự giúp đỡ. đã làm việc! –

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