2017-01-21 60 views
0

上面的代碼使用其當前文件名詳細信息將一組文件夾中的所有文件重命名爲「文件x在x層深」,但我希望它也重命名這些文件的文件夾到「x層深處的文件夾x」,但它給出了一個錯誤,說明該文件夾已在另一個進程中打開。上面的評論是我到現在爲止所做的(沒有成功),其餘的都是按照想要的方式工作。重命名其中的文件夾和文件

import os, re 

def everydirectory(path): 
    for file in os.listdir(path): 
     file_w_path = os.path.join(path, file) 
     os.chdir(path) 
     if os.path.isdir(file_w_path): 
      os.chdir(file_w_path) 
      # complete_folder_name = re.search("(deep)([0-9])(FOLDER)([0-9])", file) 
      # deepness = complete_folder_name.group(2) 
      # folder_number = complete_folder_name.group(4) 
      # new_folder_name = "Folder {} at {} levels deep".format(folder_number, deepness) 
      # new_folder_name_w_path = os.path.join(path, new_folder_name) 
      # os.rename(file_w_path, new_folder_name_w_path) 
      # print("Folder " + file_w_path + " renamed to " + new_folder_name_w_path) 
      everydirectory(file_w_path) 
     elif os.path.isfile(file_w_path): 
      path = os.path.join(path, os.getcwd()) 
      extension = os.path.splitext(file_w_path)[1] 
      complete_file_name = re.search("(deep)([0-9])(FILE)([0-9])", file) 
      deepness = complete_file_name.group(2) 
      file_number = complete_file_name.group(4) 
      new_file_name = "File {} at {} levels deep{}".format(file_number, deepness, extension) 
      new_file_name_w_path = os.path.join(path, new_file_name) 
      os.rename(file_w_path, new_file_name_w_path) 
      print("File " + file_w_path + " RENAMED TO " + new_file_name_w_path) 

directory = input("Where is the files?") 
everydirectory(directory) 

我認爲問題在於它在程序重命名文件夾後重命名文件,使其「丟失」文件的原始位置。有人可以檢查我做錯了什麼嗎?謝謝!

下面是一組文件夾/文件,我怎麼想它在運行腳本之後看:https://drive.google.com/drive/u/1/folders/0B8pLYoI76JJiOEtpNzdaYVZrVXM

+1

通常的方法來這種重命名的任務就是用遞歸來從的底部向上的工作目錄樹。重命名目錄的內容,然後重命名其父項的內容。 –

+1

嘗試在調用'everydirectory(file_w_path)'後對文件夾進行重命名。或者,也許它應該是'everydirectory(new_folder_name_w_path)'使用命名路徑而不是舊路徑? –

+0

@ PM2Ring我怎樣才能使用遞歸?我試着按照你所說的先用函數重命名文件,然後重命名文件夾,但仍然給出相同的錯誤。我讀過關於os.walk(topdown = False)的內容,但不知道如何使用它,這是你在說什麼? – Setti7

回答

0

我重構你的代碼一點,以使其發揮作用。我也一直跟蹤deep在遞歸,但你也可以依靠你的文件名,如果你喜歡:

import os, re 
import os.path 
from contextlib import contextmanager 

@contextmanager 
def change_dir(directory): 
    wd = os.getcwd() 
    try: 
     os.chdir(directory) 
     yield directory 
    finally: 
     os.chdir(wd) 


def rename_file(filename, deep, is_dir=False): 
    if is_dir: 
     complete_filename = re.search("(deep)([0-9])(FOLDER)([0-9])", filename) 
     file_number = complete_filename.group(4) 
     new_filename = "Folder {} at {} levels deep".format(file_number, deep) 
    else: 
     complete_filename = re.search("(deep)([0-9])(FILE)([0-9])", filename) 
     file_number = complete_filename.group(4) 
     extension = os.path.splitext(filename)[1] 
     new_filename = "File {} at {} levels deep{}".format(file_number, deep, extension) 

    os.rename(filename, new_filename) 


def every_directory(path, deep=0): 
    deep += 1 
    for file in os.listdir(path): 
     is_dir = False 
     filepath = os.path.join(path, file) 
     if os.path.isdir(filepath): 
      every_directory(filepath, deep) 
      is_dir = True 
     with change_dir(path): 
      rename_file(file, deep=deep, is_dir=is_dir) 
+0

我開始用python進行編程,從未見過這個「@contextmanager」,它有什麼作用? – Setti7

+1

'contextmanager'只是一個方便的裝飾器,可以用來定義一個可以與'with'語句一起使用的函數,而無需創建類或單獨的__enter __()和__exit __()方法。看看裝飾器,python中的with語句,如果你想了解更多。當你掌握這兩件事時,你可以看看contextlib的文檔:https://docs.python.org/3.4/library/contextlib.html –

+0

謝謝!我已經幾乎解決了我的問題,而不使用裝飾器(還沒有了解它們)。但是我現在卡住了:我的「固定的」新腳本沒有改變第一個文件夾(主文件夾,不是deep1FOLDER1)的文件名,我不知道爲什麼。你能幫我看看嗎?更多此[link](https://drive.google.com/drive/u/0/folders/0B8pLYoI76JJiT2I5YTVXb2t6RjQ) – Setti7