重命名多个文件夹中的多个文件

时间:2017-08-15 17:07:24

标签: python

所以我有很多具有特定名称的文件夹。在每个文件夹中我有+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)

这个提取每个文件夹的名称。

然后接下来就是输入文件夹并重命名它们。我有点被困在这里?

3 个答案:

答案 0 :(得分:2)

在Python 3.4中新增的pathlib模块经常被忽略。我发现它通常使代码比os.walk更简单。

在这种情况下,.glob('**/*.*')递归查看我在名为example的示例文件夹中创建的所有文件夹和子文件夹。 *.*部分表示它会考虑所有文件。

我将path.parts放在循环中,以显示pathlib为您安排解析路径名。

我首先检查字符串常量'34562346'是否在每个文件名中的正确位置。如果是,那么我只需将.parts中的项目替换为下一级文件夹' up'文件夹树。

然后我可以用新更改的文件名替换.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'

答案 1 :(得分: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)

答案 2 :(得分:0)

拆分上的每个文件名。并用文件名替换第二个项目,然后再次加入。' s以获取新文件名。这是一些演示该概念的示例代码。

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']