2017-01-21 18 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'は、クラスを作成したり、__​​enter __()や__exit __()メソッドを分離することなく、' with'ステートメントで使うことができる関数を定義するのに使うことができる便利なデコレータです。あなたが詳細を知りたい場合は、デコレータ、pythonのwith文を見てください。これらの2つのことを把握するには、contextlibのドキュメントをご覧ください:https://docs.python.org/3.4/library/contextlib.html –

+0

ありがとうございました!私はすでにデコレータを使わずに自分の問題をほぼ解決しました(まだそれらについて学んでいない)。しかし、私は今止まっています:私の "修正された"新しいスクリプトは、最初のフォルダ(deep1FOLDER1ではなく、メインフォルダの)のファイル名を変更していません。私のためにそれを見ることができますか?この[リンク]の詳細(https://drive.google.com/drive/u/0/folders/0B8pLYoI76JJiT2I5YTVXb2t6RjQ) – Setti7

関連する問題