【问题标题】:Python nested loops for renaming files用于重命名文件的 Python 嵌套循环
【发布时间】:2020-10-31 11:30:28
【问题描述】:

我想像这样使用 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 的初学者。我想过这样的事情,但这不能正常工作。只有第一个文件被重命名。然后出现一个错误,说明文件已经存在。

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

【问题讨论】:

  • 你有for x in range(10)for x in my_list。您应该使用不同的变量名。
  • @hmm,他根本不需要带范围的循环
  • @OlvinR​​oght 我会把它留给答案。我只是指出了一个错字或明显的错误。

标签: python for-loop rename nested-loops file-rename


【解决方案1】:

您正在覆盖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 列表结束时。

【讨论】:

  • 我会摆脱那条线。它不会跳转到第二个循环内的下一个文件。只有当内部循环完成时。因此,重命名的文件将不再存在,并且他得到了那个错误。最后我有一个更好的解决方案。
【解决方案2】:

您应该只需要一个 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

【讨论】:

  • 你不需要显式维护 fileCount ——这就是 enumerate 给你的!
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 2014-08-26
  • 2016-11-15
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多