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