2017-02-16 15 views
0

現在の問題を持つ、と私はos.walk/os.renameのプロセスを経るしようとしてきたPythonの、名前の変更Subdirectors

(2.7を使用して)。しかし、現時点では、メインファイルの中にあるすべてのファイルの代わりに、メインファイルだけが_finalで追加されています。

ですから、例えば

メイン ---> SUB1 - > SUB2 - > SUB3

ニーズ

(現在はここで停止)Main_final すべき----> sub1_final - > sub2_final - > sub3_final

はここ

import shutil 
import sys 
import os 

def rename(): 
     ### pseudo 
     for folderName, subfolders, filenames in os.walk(path, topdown=##???): 
      for subfolder in subfolders: 
       print subfolder 
       os.rename(os.path.join(folderName, subfolders), os.path.join(folderName, subfolders + 'rename')) 

      print('') 

    else: 
     print("Directory does not exist") 

if __name__ == '__main__': 
    copy() 

答えて

1

を働きましたサブディレクトリ。 Documentation

から

オプションの引数トップダウンがTrueであるか指定されていない、ディレクトリのトリプルは、(ディレクトリはトップダウン生成されている)そのサブディレクトリのいずれかのためのトリプル前に生成された場合。 topdownがFalseの場合、ディレクトリのトリプルはすべてのサブディレクトリ(ディレクトリがボトムアップ)にトリプル後に生成されます。トップダウンの価値にかかわらず、ディレクトリとそのサブディレクトリのタプルが生成される前に、サブディレクトリのリストが取得されます。

topdownがTrueの場合、呼び出し側はdirnamesリストを(delやsliceの割り当てを使用して)インプレースで変更することができ、walk()は名前がディレクトリ名に残っているサブディレクトリに再帰します。検索をプルーニングしたり、特定の訪問順序を指定したり、walk()を再開する前に呼び出し元が作成または名前を変更したディレクトリについてwalk()に通知することもできます。 topdownがFalseであるときのdirnamesの変更は、ボトムアップモードではdirpath自身が生成される前にdirnamesのディレクトリが生成されるため、walkの動作には何の影響も与えません。

import os 

path = "path/to/folder" 
for root, dirs, files in os.walk(path, topdown=False): 
    for dirname in dirs: 
     print os.path.join(root, dirname) 
     os.rename(os.path.join(root, dirname), os.path.join(root, dirname+"_Final")) 
+0

私のシステム上でコードをテストしてみましたメインフォルダ内のサブフォルダに移動し、最初のフォルダで停止します。 – MrRed

+0

が答えを更新しました。os.walkにtopdown = Falseパラメータを追加する必要があります – Shijo

+0

トップダウンの理解にご協力いただきありがとうございます。本当に役に立ちました! – MrRed

0

os.walk(fc)、現時点では私のコードですあなたが散歩や反復中のエントリを編集しますので、もし(それはそう、DFSトラバーサルアルゴリズムを使用して、os.walk混乱をジェネレータオブジェクトを返します。以前のスタックエントリはもう存在しません)。したがって、それは発生します。StopIteration

すべてのエントリを取得し、最も深いエントリの順にファイルの名前を変更する必要があります。最後の最初のサブディレクトリの名前を変更し、トップレベルのディレクトリは、トップレベルのディレクトリの名前を変更することはもはや影響しないだろう -

import shutil 
import sys 
import os 
from operator import itemgetter 

def copy(): 

    print("copy program") 
    set_path = "D:\\test\\test1" 
    os.chdir(set_path) 

    if os.path.exists(set_path): 
     fc ='D:\\test\\test1\\final' 
     working = '_final' 
     shutil.copytree(set_path, fc) 
     os.chdir(fc) 


     stack = [0] 
     entries = [] 
     for folder, subfolders, files in os.walk(fc): 
      lev = stack.pop() 
      for subfolder in subfolders: 
       entries.append((os.path.join(folder, subfolder), lev + 1)) 
      for file in files: 
       entries.append((os.path.join(folder, file), lev + 1)) 
      stack.extend([lev + 1]*len(subfolders)) 
     for fpath in map(itemgetter(0), sorted(entries, key=lambda x: -x[1])): 
      os.rename(fpath, fpath + working) 

    else: 
     print("Directory does not exist") 

if __name__ == '__main__': 
    copy() 

それがFalseにトップダウンセットしてツリーを歩く私のシステムで enter image description here

+0

それはファイルがそのことについて申し訳ありません – MrRed

+0

を指定見つけることができないと言って、名前の変更から私にエラーを投げていますが、私はそれが_Finalを追加していない 、それを修正し、こんにちは –

関連する問題