使用python批量重命名具有不同前缀但文件类型相同的文件



我正试图用一个从1开始的计数器递增地重命名我的文件,该计数器根据它们的前缀相同的文件扩展名来处理它们。该目录有以下文件示例:

BS - foo.fxp
BS - bar.fxp
BS - baz.fxp
...
PD - qux.fxp
PD - quux.fxp
PD - corge.fxp
...
LD - grault.fxp
LD - garply.fxp 
LD - waldo.fxp
...
PL - fred.fxp
PL - plugh.fxp
PL - xyzzy.fxp
... 
DS - thud.fxp
... 
... 
... 

我正在尝试使用增量计数器重命名具有相同前缀的所有批次。我首先想到了将所有前缀(os.split存储到列表或集合中(存储起来,然后使用此列表滚动目录中的文件。当前缀改变时,我想不出如何重置计数器。由此产生的一个例子是:

BS - 1.fxp
BS - 2.fxp
BS - 3.fxp
...
PD - 1.fxp
PD - 2.fxp
PD - 3.fxp
PD - 4.fxp
...
... 

这是原始代码,但在所有文件中递增,而不是每批前缀。

import os, glob
path ='foo/bar/fox' 
def prefix(f):
if f.endswith('.fxp'): 
return(f.split(' -')[0])
os.chdir(path)
count = 0 
for f in sorted(os.listdir(path), key = prefix):
if prefix(f) == f.split(' -')[0]:
count =+ 1
new_name = prefix(f) + '_' + str(count)+ '.fxp'
os.rename(f, new_name)

感谢您的帮助。

我写这段代码也是为了同样的目的,但你可以修改它并重复使用。。。

import os
# Function to rename multiple files
def main():
i = 0
path="path to files"
for filename in os.listdir(path):
t = os.path.splitext(os.path.basename(f)) 
my_dest = t[0] + str(i) + t[0]
my_source =path + filename
my_dest =path + my_dest
# rename() function will
# rename all the files
os.rename(my_source, my_dest)
i += 1
# Driver Code
if __name__ == '__main__':
# Calling main() function
main()

对于那些偶然发现这一点的人,我分两步解决了这个问题:首先,将所有文件路径添加到dict中,其中密钥等于在这种情况下所讨论的前缀(BS、LD、PD、PL、DS…(,并且这些密钥的值等于具有关于每个前缀的文件路径的字符串列表,具有以下代码块:

path ='foo/bar/fox' #directory path 
patches_dict = {}
os.chdir(path)
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.fxp'):
prefix, _ = file.split(' -')
filepath = root + file
prefix_dict[patch_type] = [filepath] if prefix not in prefix_dict else prefix_dict[prefix] + [filepath] 
#method append value to list of specified key and if key doesn't exist it will create an empty list and add the value in question to that list

第二步是在每个键中迭代这些值,并枚举要添加到文件路径名称中的列表的长度,同时保留前缀,请参见以下内容:

for keys, values in prefix_dict.items(): #iterating through keys&values in dict
for i, v in enumerate(values,1): #enumerate will start with 1 instead of 0
old_path = v
new_path = os.path.join( os.path.dirname(v) + '/' + keys +str(i) + '.fxp')
os.rename(v, new_path)

感谢SO社区:(!

最新更新