2017-08-15 152 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]) 

這一個只是列出的所有文件夾的整個路徑。

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

的pathlib模塊,在Python 3.4是新的,往往被忽視。我發現它通常使代碼比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

分割每個文件名。並用文件名替換第二個項目,然後再次加入。新文件名。以下是一些演示此概念的示例代碼。

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)