所以我有很多具有特定名称的文件夹。在每个文件夹中我有+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)
这个提取每个文件夹的名称。
然后接下来就是输入文件夹并重命名它们。我有点被困在这里?
答案 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']