您花了多少时间重命名文件?您是否想知道是否可以更快速、更轻松地完成此操作?如果您可以在眨眼间重命名大量文件会怎么样?Python 附带多个内置模块和函数来执行此操作。在本文中,您将学习如何使用其中的许多模块和函数在 Python 中重命名和移动文件。

Rename files in Python

图片来源:Chris Ried - unsplash

Python 是一种功能强大的编程语言。由于其语法简单,因此易于学习,而且用途广泛。您几乎可以用它做任何事情,这解释了它如此受欢迎的原因。

即使你不是专业的开发人员,你也可以通过 几行 Python 代码 。我信奉“聪明的懒惰”的理念。如果你必须做三次以上的事情,那就写一个脚本,省去很多麻烦!

我发现,一开始花点时间自动化那些我经常要执行的任务是值得的,这样最终可以节省时间。这也有助于我提高解决问题的能力。这些任务之一是 重命名和移动一批文件 .

如果您不知道如何操作,或者我刚才说的话听起来很艰难,请不要担心。在 ,我们会支持您!在本文中,我将向您展示如何在 Python 中移动和重命名文件。

事不宜迟,让我们开始吧!为了确保我们意见一致,我使用 Windows 10 Python 3.8.5 对使用 Python 进行 字符串操作 有一定的了解也是一个好主意,但不是强制性的

基本文件和目录操作

为了热身,让我们使用 os 模块执行一些基本操作。这将使我们稍后更容易理解如何在 Python 中重命名文件。

os 模块允许脚本直接与操作系统交互。它是 Python 标准内置实用程序包的一部分,无需安装。

让我们写一些代码来改变目录 os.chdir() 并显示当前目录 os.getcwd() .

# import os module
import os

# change directory
os.chdir('c:\\MyDirectory')

# display the current directory
cwd = os.getcwd()

# display directory content
print("current working directory:", cwd)

输出如下:

Rename files in Python

要运行脚本,请打开 Python 终端并运行:

python your_scriptname.py

如果你好奇,你可以 os.chdir() 在这里 和 os.getcwd() 这里 .

当您探索新概念、库或框架时,阅读官方文档总是一个好主意。

使用 os.rename() 在 Python 中重命名文件

现在我们已经了解了一些基础知识,让我们应用 rename os 模块中的方法在 Python 中重命名文件。要重命名单个文件,我们需要输入文件的当前名称及其当前位置,以及新名称及其目标。

让我们运行一个例子。在本教程中,我收集了一些我们将在 Python 中重命名的库存照片。这是我的初始照片文件夹。

Rename files in Python Rename files in Python

首先,我们要重命名这张美丽的红色天空图片。如你所见,文件名不太好读。让我们重命名它 red_sky.jpg .

首先,我们可以使用属性获取文件名、类型和位置。稍后我们将看到,我们可以使用 Python 获取目录中的文件名。但现在让我们先简单一点。

Rename files in Python

这是我们的脚本:

# import os module
import os

# state file origin and destination as
# os.rename(source, destination)
os.rename(r'C:\py_scripts\photos\abhijeet-gaikwad-bokneofJXeI-unsplash.jpg', r'C:\py_scripts\photos\red_sky.jpg')
print("success")

Python 原始字符串是以字母 r 为前缀的普通字符串。它将反斜杠等字符视为普通字符,而不是转义字符。这确保了路径的正确性,以便我们可以在 Windows 上的 Python 中移动和重命名文件。

此外,最后一个字符不能是反斜杠,因为这会引发语法错误。

让我们运行脚本并验证输出:

Rename files in Python

我们的文件已成功重命名!您可以 在此处 以及 有关使用 Python 处理文件和目录的课程 .

Python 中重命名文件 过程背后的机制 ,需要注意的是,重命名就像移动,反之亦然。

但是,如果源位置和目标位置位于不同的分区、驱动器或设备上, os.rename() 则不起作用。如果是这种情况,请使用 shutil.move()

使用shutil.move()在Python中移动文件

Shutil 模块也是 Python 标准实用程序模块的一部分。因此,不需要安装它。

Shuutil 可帮助自动执行复制和删除文件和/或目录的过程。使用 shutil.move() ,不仅可以重命名文件,还可以更改文件目录。

让我们使用重命名的图片 red_sky.jpg 。我们将它移动到名为 awesome 的新文件夹并重命名图片 awesome_sky.jpg 。你准备好了吗?

这是运行我们的脚本之前我的照片目录的屏幕截图。

Rename files in Python

让我们编写脚本。我们需要导入模块 shutil 并声明文件的初始路径及其目标。为了使代码更具可读性,我将初始路径分配给名为的变量 src ,将目标路径分配给 dst .

最后,我们 move 从shutil模块调用该方法。

# import shutil
import shutil

# file source and destination
src=r'C:\py_scripts\photos\red_sky.jpg'
dst=r'C:\py_scripts\photos\awesome\awesome_sky.jpg'

# change file directory and rename file as awesome_sky
shutil.move(src, dst)

正如我们之前所做的那样,您现在可以在 Python 终端中运行该脚本。这是最终结果。

Rename files in Python

您可以看到我们已成功将文件移动到 awesome 目录并将其重命名 awesome_sky。jpg 。因此,在此示例中,我们学习了如何在 Python 中重命名和移动文件 .

很棒,不是吗?

当您使用时 shutil.move() ,会在目标路径中创建文件的副本,并删除原始文件。

shutil.move() ,与将管理不同的设备、磁盘或分区相反 os.rename() 。在这种情况下, shutil.move() 将首先复制文件,然后将其从原始位置删除。

如果您不想更改文件名,则无需将其作为目标参数传递。例如:

shutil.move("my_file.txt", "new_directory")

在此处 shutil.move() 了解更多信息 。此外,欢迎随时查看 我们关于使用 Python 处理文件和目录的课程 .

使用shutil.copy()在Python中移动文件

我们还可以使用 shutil.copy() 将文件从一个目录复制到另一个目录。与此不同,它 shutil.move() , shutil.copy() 不会从原始位置删除文件。

在此示例中,我有一张名为 的图片 photo_1.jpg ,我想将其复制到名为 data1 的文件夹中,如下所示:

Rename files in Python

让我们编写一个脚本来 shutil.copy() 执行此任务。

# import
import shutil

# state source and destination folder
src = r'C:\py_scripts\photos\photo_1.jpg'
dst = r'C:\py_scripts\photos\data1'

# copy src to dst
shutil.copy(src, dst)

结果如下:

Rename files in Python Rename files in Python

我们的 photo_1.jpg 文件仍然在源目录中,并且我们的脚本在我们的文件夹中创建了相同文件的副本 data1

shutil.copy() 此处的 文档 以及 有关使用 Python 处理文件和目录的课程 .

使用 Pathlib 的 Path.rename() 在 Python 中重命名文件

Python pathlib 是一个用于处理文件系统路径的面向对象框架。如果您想知道如何在 pathlib 和 os 模块之间进行选择,那么有几个关键区别。

os 模块使用字符串表示路径,同时 pathlib 创建目录对象。使用 pathlib 可以提高代码的可读性和可维护性,以及可移植到不同的操作系统。

让我们用 重命名一个文件 pathlib 。在此示例中,我们将拍摄一张新照片并使用 重命名 pathlib 。如您所见,我们的图片名称目前不太易读。

Rename files in Python

那么,让我们编写脚本。 Pathlib 有一种干净、直观的构建路径的方法,我们可以将其写成:

Path.cwd() / 'sub directory' / 'filename'

一旦使用类设置了当前文件的路径 Path ,我们就会使用 rename 以新路径和文件名作为参数的方法。

代码如下:

# import Path class from pathlib
from pathlib import Path

# define file path that we want to rename
filepath = Path.cwd() / 'photos' / 'diego-ph-5LOhydOtTKU-unsplash.jpg'

# rename file
filepath.rename(Path.cwd() / 'photos' / 'shooting_star.jpg')

请参见下面的结果。

Rename files in Python

我们的文件名现在是 shooting_star.jpg 。您可以 在此处 以及 有关在 Python 中处理文件和目录的课程 pathlib 库的更多信息,以在 Python 中重命名文件 .

使用 os.rename() 和 os.listdir() 在 Python 中批量重命名文件

我们可以逐个重命名文件,但如果文件很多,这可能会变得繁琐和/或不可能。想象一下,您必须准备一个包含数千张图片的数据集来训练计算机视觉模型。这根本不可能手动完成。

相反,我们可以用 Python 批量重命名文件。让我们选择一个包含数百张图片的文件夹,使用 Python 来重命名,以自动完成此任务。

Rename files in Python

再次,我们将使用 os.rename() 。但是,这次,我们需要编写一个函数来循环遍历目录并逐个重命名文件。不要忘记在目标中添加文件夹路径。

我们将使用该 os.path.join() 方法。第一个参数是 path_name ,第二个参数是文件名。这使代码更易读、更简洁。它还使在不同操作系统上重用相同代码变得更加容易。

只需修改 path_name 变量。在 dst 变量中,第二个参数是新文件名。我将新的文件格式分配给一个名为 new .

enumerate() 函数将返回一个集合作为对象,并添加一个计数器作为该对象的键。

# import os module
import os

# folder path and destination
path_name = r'C:\py_scripts\photos\data'

# loop through the directory to rename all the files
for count, filename in enumerate(os.listdir(path_name)):
        new ="pic-" + str(count) + '.jpg'  # new file name
        src = os.path.join(path_name, filename)  # file source
        dst = os.path.join(path_name, new)  # file destination
        # rename all the file
        os.rename(src, dst)

让我们检查一下结果:

Rename files in Python

我们的图片已成功重命名。如果您想了解更多信息 os.listdir() 此处的 文档 以及 我们关于使用 Python 处理文件和目录的课程 .

使用 os.scandir() 在 Python 中批量重命名文件

而不是 os.scandir() 重命名多个文件, os.listdir(). os.scandir() 速度更快,因为它获得了 os.DirEntry 对象的迭代器。

让我们编写一些代码。我们将使用一个名为 data1 包含多张图片的文件夹。这次,我们将使用 img 作为前缀重命名我们的文件。

# import os module
import os

# folder path
path = r'C:\py_scripts\photos\data1'

# set counter
count = 1
for f in os.scandir(path):
    if str(f.name).endswith('.jpg'):
        new_file = 'img-' + str(count)+'.jpg'
        src = os.path.join(path, f.name)
        dst = os.path.join(path, new_file)
        os.rename(src, dst)
        count += 1

# close iterator to free some resources
os.scandir(path).close()

这里,与前面的代码片段相反,我添加了一个条件语句来检查文件是否具有 .jpg 扩展名。在这种情况下,只有具有 .jpg 文件扩展名的文件才会被重命名。

不要忘记 os.scandir() 在最后关闭迭代器以释放一些资源并提高代码效率。

如您所见,我们只是使用 os.scandir() 方法重命名了 data1 文件夹:

Rename files in Python

在此处 os.scandir() 了解有关如何在 Python 中批量重命名文件的更多信息 ,也可以在 我们的课程中了解如何在 Python 中处理文件和目录 .

使用 Pathlib 的 Path.iterdir() 在 Python 中批量重命名文件

我们还可以使用 pathlib 的 批量重命名 Python 中的文件 Path.iterdir() 。 类似于 os.scandir() , Path.iterdir() os.listdir() .

这次,我有一个名为 data1 的文件夹,里面有名为 photo_1.jpg , photo_2.jpg ,... 的图片,我想将它们重命名为 img-1.jpg , img-2.jpg ,...

Rename files in Python

让我们编写脚本来重命名它们全部。

# import
from pathlib import Path

# set the directory
path = Path.cwd() / 'photos' / 'data1'

# set a counter
counter = 1

# loop through the directory and rename the files
for file in path.iterdir():
    if file.is_file():
        new_file = "img-" + str(counter) + file.suffix
        file.rename(path / new_file)
        counter += 1

结果如下:

Rename files in Python

建议使用 os.scandir() 或 pathlib, Path.iterdir() 因为这些方法在性能方面更佳,尤其是在包含大量文件的文件夹中。作为一般准则,编写高效的代码始终是一种好习惯,因为它可以节省时间和资源。

在此处 Path.iterdir() 阅读有关如何使用 pathlib 在 Python 中批量重命名文件的更多信息, 也可以在 我们的课程中了解如何在 Python 中处理文件和目录 .

使用 Python 按顺序批量重命名文件

上述方法对于重命名文件非常有效,但它们没有对文件进行排序以保持文件有序。为了保持文件有序,我们可以使用 按最后修改时间对文件进行排序 os.path.getmtime(x) 。然后我们可以根据修改时间重命名文件,并使用 在文件名中添加序列号 zfill() .

让我们编写一些代码来按顺序重命名名为 data 的文件夹中的文件。我们想重命名它们 photo-01.jpg , photo-02.jpg ,等等。

# import os module
import os

# directory path
path_name = r'C:\py_scripts\photos\data'

# Sort list of files based on last modification time in ascending order using list comprehension
name_list = os.listdir(path_name)
full_list = [os.path.join(path_name,i) for i in name_list]
sorted_list = sorted(full_list, key=lambda x: os.path.getmtime(x))

# initiate counter
count = 0

# loop through files and rename
for file in sorted_list:
    # print(file)
    prefix = "photo-"
    counter = str(count).zfill(2)
    new = prefix + counter + '.jpg'  # new file name
    src = os.path.join(path_name, file)  # file source
    dst = os.path.join(path_name, new)  # file destination
    os.rename(src, dst)
    count +=1

以下是最终结果:

Rename files in Python

使用 glob.glob() 和 glob.iglob() 在 Python 中批量重命名文件

在 Python 中,我们还可以使用 glob 模块来检索与预定模式匹配的文件和路径名。使用 glob 模式比其他方法匹配目录中的路径名更快。

与本文中的前几个模块类似,它内置于 Python,因此我们无需安装任何东西。

我们可以使用 glob.glob() glob.iglob() 从目录和子目录内部递归检索路径。与方法不同 glob.glob() glob.iglob() 方法返回一个迭代器,这意味着并非所有值都存储在内存中,从而提供更高的效率。

重命名文件来 os.rename() 完成操作

递归模式是一系列指令,它会循环回到自身的开头,直到检测到某些条件已经满足(比如到达需要处理的末尾)。

在继续之前,请注意。如果您决定使用递归模式, 请格外小心, . 您需要正确设置基本情况 ,否则,它可能会变成无限循环,并且递归函数将永远保持自我调用。

您可能可以想象,如果您的代码永远地重命名您的文件,一个接一个的目录,会造成多大的损害......如果您想探索这一点,请设置一个虚拟环境并观察您的操作系统崩溃。

递归模式很强大,但需要受到基本情况的约束

在此示例中,我们将处理一个名为 的文件夹 data1 ,其中包含大量图像。我们想重命名所有图像。首先,让我们通过显示文件名来验证我们是否选择了正确的文件。

# import glob
import glob

# glob.glob() returns a list of file names
print("Using glob.glob()")
files = glob.glob(r'C:\py_scripts\photos\data1\**\*.jpg', recursive = True)
for file in files:
    print(file)

# glob.iglob() returns an iterator
print("\nUsing glob.iglob()")
for f in glob.iglob('C:\py_scripts\photos\data1\**\*.jpg', recursive = True):
    print(f)

以下是我们使用的输出 glob.glob()

Rename files in Python

下面是使用以下命令的输出 glob.iglob()

Rename files in Python

我们的代码正确识别了要重命名的图片。所以,让我们重命名图片。有了 glob.glob() ,您可以使用以下代码:

# import
import os
import glob

# path
path = r'C:\py_scripts\photos\data1'
path_name = r'C:\py_scripts\photos\data1\**\*.jpg'
# set counter
counter = 1

for f in glob.glob(path_name, recursive = True):
    #print(f)
    new =  "Pic_" + str(counter).zfill(5) + ".jpg"
    dst = os.path.join(path, new)
    os.rename(f, dst)
    counter +=1

字符串的 zfill() 方法将用五位数字重命名图片: Pic_00001.jpg , Pic_00002.jpg 等。请根据需要随意更改位数。

以下是最终结果:

Rename files in Python

如果您愿意 glob.iglob() ,您可以使用以下命令:

# import
import os
import glob

# path
path = r'C:\py_scripts\photos\data1'
path_name = r'C:\py_scripts\photos\data1\**\*.jpg'
# set counter
counter = 1
# glob.iglob() returns an iterator

for f in glob.iglob(path_name, recursive = True):
    #print(f)
    new = "Picture_" + str(counter) + ".jpg"
    dst = os.path.join(path, new)
    os.rename(f, dst)
    counter +=1

以下是最终结果:

Rename files in Python

您可以在 glob.glob() 此处 和 glob.iglob() 此处 。 不要忘记查看我们的课程,了解 如何使用 Python 处理文件和目录 .

使用 os.walk(cwd) 在 Python 中批量重命名文件

让我们让它更复杂一点。我们还可以从嵌套目录中获取文件,重命名它们,并将它们移动到单个目录中。让我们用 os.walk(cwd) .

os.walk() 通过自上而下或自下而上遍历目录树来生成目录树中的文件名。然后,它会生成一个包含三个元素的元组 ( dir_path , dir_names , file_names )。

这次,我在两个不同的文件夹中有图片,分别名为 data1 data2 。我想重命名它们并将它们全部移动到名为 all .

这是我的 data1 文件夹:

Rename files in Python

这是我的 data2 文件夹:

Rename files in Python

让我们写一些代码:

# import
import os

# define current working directory
cwd = 'C:\py_scripts\photos'
count = 1
for dir_path, dir_names, file_names in os.walk(cwd):
    for f in file_names:
        if f.endswith('.jpg'):
            new = 'pic_' + str(count) + '.jpg'
            dest_dir = os.path.join(cwd,'all')
            # create new directory if does not exist
            if not os.path.isdir(dest_dir):
                os.mkdir(dest_dir)
            os.rename(os.path.join(dir_path, f), os.path.join(dest_dir, new))
            count += 1

结果如下:

Rename files in Python

因此,我们的 data1 data2 文件夹现在是空的,并且我们的图片已被重命名并移动到所有文件夹。

在此处 os.walk() 了解更多信息 。您还可以查看我们 关于使用 Python 处理文件和目录的 .

结束语

我们在本文中涵盖了很多内容!我们学习了多种方法:

  • 在 Python 中重命名文件
  • 使用 Python 移动文件
  • 使用 Python 批量重命名文件
  • 使用 Python 批量移动文件

请不要犹豫,重用上面的代码来帮助你入门。使用代码并开始使用 Python 自动执行一些重复任务。

为了将您的 Python 编程技能提升到更高的水平,请不要忘记查看我们的 Python 编程轨迹 和 !

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部