Python 重命名文件的嵌套循环
Python nested loops for renaming files
我想像这样使用 os.rename() 重命名文件:
x_y.jpg
x
应该来自列表 ['2', '3', '4', '5', '8', '9', '10']
.
y
应该从 1
数到 10
。在达到 10
后,x
应该跳到列表中的第二个数字(此处:'3'
)并且 y
应该再次开始计数。像这样:
2_1.jpg
2_2.jpg
2_3.jpg
...
3_1.jpg
3_2.jpg
我认为最好的办法是构建一个嵌套循环,但我不确定如何,因为我是初学者 python.I 想过这样的事情,但这不能正常工作.只有第一个文件被重命名。然后出现一个错误,说该文件已经存在。
my_list = ['2', '3', '4', '5', '8', '9', '10']
included_extensions = ['jpg', 'JPG']
directory = [fn for fn in os.listdir(source_folder)
if any(fn.endswith(ext) for ext in included_extensions)]
for y, file in enumerate(directory):
for x in range(10):
for x in my_list:
os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, ''.join([str(x),'_',str(y+1),'.jpg'])))
您正在覆盖 x
。你的循环也没有做他们需要做的事情。通过在第一个循环中遍历文件,您的内部循环将为每个 运行 具有相同的文件名,因此在第一个 运行 之后,文件将被重命名,第二个 运行无法再访问它。
for y, file in enumerate(directory):
for x in range(10): # first x
for x in my_list: # second x
os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, ''.join([str(x),'_',str(y+1),'.jpg'])))
此外,使用嵌套循环是一个不错的主意,但是您需要这样做
i = 0
for y in my_list:
for x in range(10):
os.rename(os.path.join(source_folder, directory[i]), os.path.join(destination_folder, '{}_{}.jpg'.format(y, x)))
i += 1
跳转 y
,当 x
达到 10 时。我会定义一个 i
变量来跟踪下一个文件,并在每个文件之后执行 i += 1
重命名,这样您可能需要一个退出条件,当 directory
列表结束时。
你应该只需要一个 for 循环。您只想重命名每个文件一次,因此您应该只需要遍历文件名一次。
要遍历所需的不同名称类型,您可以改用枚举中的索引。例如 - 使用
for z, file in enumerate(directory):
每次到达新文件时,您的 'x' 和 'y' 值都可以像
this_x = my_list[z // 10]
this_y = z % 10
以类似
的方式结束
for z, file in enumerate(directory):
newName = str(my_list[z // 10]) + '_' + str(z % 10) + '.jpg'
os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, newName))
fileCount += 1
我想像这样使用 os.rename() 重命名文件:
x_y.jpg
x
应该来自列表 ['2', '3', '4', '5', '8', '9', '10']
.
y
应该从 1
数到 10
。在达到 10
后,x
应该跳到列表中的第二个数字(此处:'3'
)并且 y
应该再次开始计数。像这样:
2_1.jpg
2_2.jpg
2_3.jpg
...
3_1.jpg
3_2.jpg
我认为最好的办法是构建一个嵌套循环,但我不确定如何,因为我是初学者 python.I 想过这样的事情,但这不能正常工作.只有第一个文件被重命名。然后出现一个错误,说该文件已经存在。
my_list = ['2', '3', '4', '5', '8', '9', '10']
included_extensions = ['jpg', 'JPG']
directory = [fn for fn in os.listdir(source_folder)
if any(fn.endswith(ext) for ext in included_extensions)]
for y, file in enumerate(directory):
for x in range(10):
for x in my_list:
os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, ''.join([str(x),'_',str(y+1),'.jpg'])))
您正在覆盖 x
。你的循环也没有做他们需要做的事情。通过在第一个循环中遍历文件,您的内部循环将为每个 运行 具有相同的文件名,因此在第一个 运行 之后,文件将被重命名,第二个 运行无法再访问它。
for y, file in enumerate(directory):
for x in range(10): # first x
for x in my_list: # second x
os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, ''.join([str(x),'_',str(y+1),'.jpg'])))
此外,使用嵌套循环是一个不错的主意,但是您需要这样做
i = 0
for y in my_list:
for x in range(10):
os.rename(os.path.join(source_folder, directory[i]), os.path.join(destination_folder, '{}_{}.jpg'.format(y, x)))
i += 1
跳转 y
,当 x
达到 10 时。我会定义一个 i
变量来跟踪下一个文件,并在每个文件之后执行 i += 1
重命名,这样您可能需要一个退出条件,当 directory
列表结束时。
你应该只需要一个 for 循环。您只想重命名每个文件一次,因此您应该只需要遍历文件名一次。
要遍历所需的不同名称类型,您可以改用枚举中的索引。例如 - 使用
for z, file in enumerate(directory):
每次到达新文件时,您的 'x' 和 'y' 值都可以像
this_x = my_list[z // 10]
this_y = z % 10
以类似
的方式结束
for z, file in enumerate(directory):
newName = str(my_list[z // 10]) + '_' + str(z % 10) + '.jpg'
os.rename(os.path.join(source_folder,file), os.path.join(destination_folder, newName))
fileCount += 1