2017-06-09 21 views
0

私はディレクトリの大量のリストを持っており、指定したディレクトリ/フォルダをある場所から別の場所にコピーしようとしていますが、「階層」を複製しようとしています。ファイルパスに基づいて複数のフォルダを作成する

list_of_dirs = [ 
'/serverA/user_data/2017_Jan/2017_01_25/reference/images/setA/', 
'/serverA/user_data/2017_Jan/2017_01_26/reference/images/setA/', 
] 

lib_path = '/serverB/user_data' 
dirs_length = len(list_of_dirs) 

collate_date_names = [] 

def create_main_folder(main_folder_name): 
    base_folder_path = '{0}/{1}/'.format(lib_path, main_folder_name) 
    base_folder = os.path.dirname(base_folder_path) 
    if not os.path.exists(base_folder): 
     os.makedirs(base_folder_path) 



def create_sub_date_folder(base_folder, folder_name): 
    folder_path = '{0}/{1}/{2}/'.format(lib_path, base_folder, folder_name) 
    base_folder = os.path.dirname(folder_path) 
    if not os.path.exists(base_folder): 
     os.makedirs(folder_path) 

def main(): 
    for directory in enumerate(list_of_dirs): 
     date_range_string = directory[1].split('/')[3] 
     create_main_folder(date_range_string) 

     if date_range_string in directory[1]: 
      folder_name = directory[1].split('/')[-2] 
      create_sub_date_folder(date_range_string, folder_name) 

      new_main_folder = '{0}/{1}'.format(lib_path, date_range_string) 
      new_folder_path = '{0}/{1}/{2}'.format(lib_path, date_range_string, folder_name) 

      subprocess.call('cp -r {0} {1}'.format(directory[1], new_main_folder), shell=True) 

main() 

splitコマンドを使用している間、私は単純に次の項目を取得しようとしていますように私は、これらの複数のフォルダを作成しようとしています方法は理想的ではないかもしれないと思われます。

私の上記のコードを実行しているが、これは私が見てい階層構造であり、それは私が欲しかったものではありません。

|- 2017_Jan 
|--|-- 2017_01_25 
|--|--|-- setA 
|--|-- 2017_01_26 
|--|--|-- setA 

これは私が達成しようとしているものですに対し:

|- 2017_Jan 
|--|-- 2017_01_25 
|--|--|-- reference 
|--|--|--|-- images 
|--|--|--|--|-- setA 
|--|-- 2017_01_26 
|--|--|-- reference 
|--|--|--|-- images 
|--|--|--|--|-- setA 

私はこの構造を作ることができる最良の方法は何ですか?

+0

なぜだけではなく、[ 'os.makedirs()'](HTTPS://docs.python .org/3/library/os.html?highlight = os.makedirs#os.makedirs)? – JakeD

答えて

1

あなたの説明から何かが得られない限り、これは必要以上に複雑に見えます。必要なのは、その共通のプレフィックスパスをオフに剃るだけ休みを作成、おそらく他のパスにすることです:

import os 

list_of_dirs = [ 
    '/serverA/user_data/2017_Jan/2017_01_25/reference/images/setA/', 
    '/serverA/user_data/2017_Jan/2017_01_26/reference/images/setA/', 
] 

source_path = "/serverA/user_data/" # strip off this from all paths 
target_path = "/serverB/user_data/" # destination for the paths 

for path in list_of_dirs: 
    if path.startswith(source_path): # just in case we have a path without a common prefix 
     path = path[len(source_path):] 
    os.makedirs(target_path + path, exist_ok=True) # this creates the desired path 

# gives: 
# 
#/serverB 
# |-- user_data 
#  |-- 2017_Jan 
#   |-- 2017_01_25 
#   | |-- reference 
#   |  |-- images 
#   |   |-- setA 
#   |-- 2017_01_26 
#    |-- reference 
#    |-- images 
#     |-- setA 
+0

ありがとう、私はあなたが書いたコードを使用し、わずかに変更し、自分のコードに実装し、それは動作します!しかし、私は好奇心が強いです - あなたが書いたコードは、「共通の」経路用語がある場合にのみ動作します。 – dissidia

+0

上記のコードは、元のデータの '機能'を使用して、パスの先頭を簡単に取り除き、ターゲットパスをその場所に配置します。別のデータセットの場合は、ターゲットパスに複製する 'ルート'パスを見つけるために別の戦略を使用します。 ['os.path'](https://docs.python.org/3/library/os.path.html)モジュールで利用できるパスを扱うためのツールがたくさんありますので、もしあなたが意図しているかどうか確かめてくださいもっと複雑なもの。ターゲットパスを取得すると、 'os.makedirs()'と 'exist_ok = True'はそれにフィードする有効なパスを作成します。 – zwer

関連する問題