使用Python重命名目录中的多个文件

50

我正在尝试使用这个Python脚本重命名目录中的多个文件:

import os
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)
i = 1

for file in files:
    os.rename(file, str(i)+'.jpg')
    i = i+1

当我运行这个脚本时,会出现以下错误:

Traceback (most recent call last):
  File "rename.py", line 7, in <module>
    os.rename(file, str(i)+'.jpg')
OSError: [Errno 2] No such file or directory

为什么会这样?我该如何解决这个问题?

谢谢。


2
你必须指定完整路径。 - Vedang Mehta
1
你的 files 列表将包含给定 path 中的所有文件,但当你执行 os.rename() 时,它会在当前工作目录中查找文件。 - Vedang Mehta
4
os.listdir()仅返回文件名而不是完整路径。使用os.path.join(path, file)来获取完整路径并重命名文件。 - Daniel Underwood
使用pathlib的另一种方法,请参阅:https://stackoverflow.com/q/72521487/2745495 - undefined
8个回答

123

在重命名时,您没有给出完整的路径,请按以下方式操作:

import os
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)


for index, file in enumerate(files):
    os.rename(os.path.join(path, file), os.path.join(path, ''.join([str(index), '.jpg'])))

编辑:感谢tavo,第一个解决方案会将文件移动到当前目录,现已修复。


2
请注意,这将同时将文件移动到当前目录。为了避免这种情况,请使用os.rename(os.path.join(path, file), os.path.join(path, str(i)+'.jpg'))代替。 - tavo
还要注意join方法。你的代码会返回TypeError: join() takes exactly one argument (2 given)!为了避免这种情况,只需将代码的最后一行替换为以下内容:os.rename(os.path.join(path, file), os.path.join(path, ''.join([str(index), '.jpg']))) - Jaroslav Bezděk
感谢 @JaroslavBezděk - noteness
请在这个答案中考虑使用 enumerate,否则您将会收到一个 ValueError: too many values to unpack (expected 2) 的错误提示。 - Timo
在@JaroslavBezděk的基础上添加''.join(),需要将一个数组作为参数来连接/合并文本。 - Timo
我以简单的方式编写了 os.rename(os.path.join(path, file), os.path.join(path, str(index)+ '.jpg')),如下图所示 在这里向下滚动 - Timo

8

首先,您需要将此路径设置为当前工作目录。

操作很简单。

代码的其余部分没有错误。

要将其设置为当前工作目录:

os.chdir(path)

8
import os
from os import path
import shutil

Source_Path = 'E:\Binayak\deep_learning\Datasets\Class_2'
Destination = 'E:\Binayak\deep_learning\Datasets\Class_2_Dest'
#dst_folder = os.mkdir(Destination)


def main():
    for count, filename in enumerate(os.listdir(Source_Path)):
        dst =  "Class_2_" + str(count) + ".jpg"

        # rename all the files
        os.rename(os.path.join(Source_Path, filename),  os.path.join(Destination, dst))


# Driver Code
if __name__ == '__main__':
    main()

2
根据@daniel的评论,os.listdir()仅返回文件名而不是文件的完整路径。使用os.path.join(path, file)获取完整路径并进行重命名。
import os
path = 'C:\\Users\\Admin\\Desktop\\Jayesh'
files = os.listdir(path)
for file in files:
   os.rename(os.path.join(path, file), os.path.join(path, 'xyz_' + file + '.csv'))

请提供详细信息,说明这如何更好地解决了这个问题,并且如何扩展之前的答案。 - Stefan Crain

1

我只是在尝试接受的答案中定义路径变量和列表:

path = "/Your/path/to/folder/"
files = os.listdir(path)

然后循环遍历该列表:
for index, file in enumerate(files):
    #print (file)
    os.rename(path+file, path +'file_' + str(index)+ '.jpg')

或者使用一行代码像Python列表推导式一样循环:

[os.rename(path+file, path +'jog_' + str(index)+ '.jpg')  for index, file in enumerate(files)]

我认为第一个更易读,在第二个中循环的第一部分只是列表推导式的第二部分。


0

这对我有用,通过将索引增加1,我们可以为数据集编号。

import os  
     
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)
index=1
        
for index, file in enumerate(files):
     os.rename(os.path.join(path, file),os.path.join(path,''.join([str(index),'.jpg'])))
     index = index+1

但是,如果您当前的图像名称以数字开头,则此方法将无法正常工作。


0
如果你的文件名以随机方式重命名,则必须首先对目录中的文件进行排序。给定的代码首先进行排序,然后重命名文件。
import os
import re
path = 'target_folder_directory'
files = os.listdir(path)
files.sort(key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])
for i, file in enumerate(files):
    os.rename(path + file, path + "{}".format(i)+".jpg")

-1

我编写了一个快速灵活的脚本来重命名文件,如果你想要一个可行的解决方案而不是重复造轮子。

它通过传递“替换函数”来重命名当前目录中的文件。

每个函数指定您想要对所有匹配文件名进行的更改。代码将确定将要进行的更改,并使用颜色显示它将生成的差异,并要求确认以执行更改。

您可以在此处找到源代码,并将其放置在您想要重命名文件的文件夹中 https://gist.github.com/aljgom/81e8e4ca9584b481523271b8725448b8

它在pycharm中运行良好,我还没有在其他控制台上测试过

定义了一些替换函数后,交互将看起来像这样 enter image description here

当它运行第一个时,它会显示与目录中匹配的文件的所有差异,您可以确认进行替换或不替换,就像这样 输入图像描述


非常感谢,运行得很好!更好的使用说明会有所帮助,可以使用三行函数移动和重命名目录,以及您的rename_files.py confirm_and_rename函数。 - Pieter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接