2017-08-15 18 views
1

特定の名前のフォルダがたくさんあります。各フォルダには+200アイテムあります。フォルダ内のアイテムの名前は、複数のフォルダ内の複数のファイルの名前を変更する

CT.34562346.246.dcm 
RD.34562346.dcm 
RN.34562346.LAO.dcm 

などです。

これで、フォルダ(34562346)がフォルダの名前に置き換えられるように、すべてのフォルダ内のすべてのファイルの名前を変更します。たとえば、 "1"という名前のフォルダでは、ファイルは次のようになります。

CT.1.246.dcm 
RD.1.dcm 
RN.1.LAO.dcm 

したがって、大きな数字だけが置き換えられます。はい、すべてのファイルはこのように似ています。それは最初の後の数字になります。その名前を変更する必要があります。

これまでのところ私が持っている:

import os 

base_dir = "foo/bar/" #In this dir I have all my folders 

dir_list = [] 
for dirname in os.walk(base_dir): 
    dir_list.append(dirname[0]) 

この1つだけで、すべてのフォルダのパス全体を示しています。

dir_list_split = [] 
for name in dir_list[1:]: #The 1 is because it lists the base_dir as well 
    x = name.split('/')[2] 
    dir_list_split.append(x) 

これは、各フォルダの名前を抽出します。

次に、次にフォルダを入力して名前を変更します。私はここにこだわっていますか?

答えて

2

のPython 3.4で追加されたpathlibモジュールは、しばしば見過ごされています。私は、os.walkを使った場合よりもコードを単純化することが多いことがわかりました。

この場合、.glob('**/*.*')は、exampleというサンプルフォルダに作成したすべてのフォルダとサブフォルダを再帰的に見ます。 *.*という部分は、すべてのファイルを考慮するという意味です。

私はpath.partsをループに入れて、pathlibがあなたのパス名を解析するように手配します。

文字列定数'34562346'が各ファイル名の最初の正しい位置にあることを確認します。それがそうであるならば、私は単にフォルダツリーの次のレベルである.partsのアイテムで置き換えます。

次に、.partsの右端の要素を新しく変更したファイル名に置き換えて、新しいパス名を作成してから、renameを実行します。いずれの場合も、新しいパス名を作成するのが適切であれば、新しいパス名を表示します。

>>> from pathlib import Path 
>>> from os import rename 
>>> for path in Path('example').glob('**/*.*'): 
...  path.parts 
...  if path.parts[-1][3:11]=='34562346': 
...   new_name = path.parts[-1].replace('34562346', path.parts[-2]) 
...   new_path = '/'.join(list(path.parts[:-1])+[new_name]) 
...   new_path 
...   ## rename(str(path), new_path) 
...  else: 
...   'no change' 
... 
('example', 'folder_1', 'id.34562346.6.a.txt') 
'example/folder_1/id.folder_1.6.a.txt' 
('example', 'folder_1', 'id.34562346.wax.txt') 
'example/folder_1/id.folder_1.wax.txt' 
('example', 'folder_2', 'subfolder_1', 'ty.34562346.90.py') 
'example/folder_2/subfolder_1/ty.subfolder_1.90.py' 
('example', 'folder_2', 'subfolder_1', 'tz.34562346.98.py') 
'example/folder_2/subfolder_1/tz.subfolder_1.98.py' 
('example', 'folder_2', 'subfolder_2', 'doc.34.34562346.implication.rtf') 
'no change' 
0

それぞれのファイル名を。 2番目の項目をファイル名に置き換えてから、新しいファイル名にもう一度結合します。概念を示すサンプルコードをいくつか示します。

folder_name = ['1', '2'] 

file_names = ['CT.2345.234.dcm', 'BG.234234.222.dcm', "RA.3342.221.dcm"] 


for folder in folder_name: 
    new_names = [] 
    for x in file_names: 
     file_name = x.split('.') 
     file_name[1] = folder 
     back_together = '.'.join(file_name) 
     new_names.append(back_together) 

    print(new_names) 

これもサブディレクトリ内のファイルの名前を変更します

['CT.1.234.dcm', 'BG.1.222.dcm', 'RA.1.221.dcm'] 
['CT.2.234.dcm', 'BG.2.222.dcm', 'RA.2.221.dcm'] 
1

出力:

import os 
rootdir = "foo" + os.sep + "bar" 
for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     filepath = subdir + os.sep + file 
     foldername = subdir.split(os.sep)[-1] 

     number = "" 
     foundnumber = False 

     for c in filepath: 
      if c.isdigit(): 
       foundnumber = True 
       number = number + c 
      elif foundnumber: 
       break 
     if foundnumber: 
      newfilepath = filepath.replace(number,foldername) 
      os.rename(filepath, newfilepath) 
関連する問題