Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重命名多个文件夹中的多个文件_Python - Fatal编程技术网

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

Python 重命名多个文件夹中的多个文件,python,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 因此,只有大量的被替换。是的,所有的文件都是这样的

所以我有很多文件夹都有一个特定的名字。在每个文件夹中,我有+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)
这一个提取每个文件夹的名称


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

在屏幕上拆分每个文件名。并用文件名替换第二项,然后再次加入新文件名的。下面是一些示例代码,演示了这个概念

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

这也将重命名子目录中的文件:

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)

pathlib模块是Python3.4中的新模块,经常被忽略。我发现它通常会使代码比使用os.walk时更简单

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

我在循环中放入
path.parts
,向您展示pathlib为您安排解析路径名

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

然后我可以用新修改的文件名替换
.parts
最右边的元素,以创建新的路径名,然后执行
重命名
。在每种情况下,如果适合创建一个路径名,我都会显示新的路径名

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