您花了多少时间重命名文件?您是否想知道是否可以更快速、更轻松地完成此操作?如果您可以在眨眼间重命名大量文件会怎么样?Python 附带多个内置模块和函数来执行此操作。在本文中,您将学习如何使用其中的许多模块和函数在 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)
输出如下:
要运行脚本,请打开 Python 终端并运行:
python your_scriptname.py
如果你好奇,你可以
os.chdir()
在这里
和
os.getcwd()
这里
.
当您探索新概念、库或框架时,阅读官方文档总是一个好主意。
使用 os.rename() 在 Python 中重命名文件
现在我们已经了解了一些基础知识,让我们应用
rename
os 模块中的方法在 Python 中重命名文件。要重命名单个文件,我们需要输入文件的当前名称及其当前位置,以及新名称及其目标。
让我们运行一个例子。在本教程中,我收集了一些我们将在 Python 中重命名的库存照片。这是我的初始照片文件夹。
首先,我们要重命名这张美丽的红色天空图片。如你所见,文件名不太好读。让我们重命名它
red_sky.jpg
.
首先,我们可以使用属性获取文件名、类型和位置。稍后我们将看到,我们可以使用 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 中移动和重命名文件。
此外,最后一个字符不能是反斜杠,因为这会引发语法错误。
让我们运行脚本并验证输出:
我们的文件已成功重命名!您可以 在此处 以及 有关使用 Python 处理文件和目录的课程 .
Python 中重命名文件 过程背后的机制 ,需要注意的是,重命名就像移动,反之亦然。
但是,如果源位置和目标位置位于不同的分区、驱动器或设备上,
os.rename()
则不起作用。如果是这种情况,请使用
shutil.move()
。
使用shutil.move()在Python中移动文件
Shutil 模块也是 Python 标准实用程序模块的一部分。因此,不需要安装它。
Shuutil 可帮助自动执行复制和删除文件和/或目录的过程。使用
shutil.move()
,不仅可以重命名文件,还可以更改文件目录。
让我们使用重命名的图片
red_sky.jpg
。我们将它移动到名为 awesome 的新文件夹并重命名图片
awesome_sky.jpg
。你准备好了吗?
这是运行我们的脚本之前我的照片目录的屏幕截图。
让我们编写脚本。我们需要导入模块
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 终端中运行该脚本。这是最终结果。
您可以看到我们已成功将文件移动到 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 的文件夹中,如下所示:
让我们编写一个脚本来
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)
结果如下:
我们的
photo_1.jpg
文件仍然在源目录中,并且我们的脚本在我们的文件夹中创建了相同文件的副本
data1
。
shutil.copy()
此处的
文档
以及
有关使用 Python 处理文件和目录的课程
.
使用 Pathlib 的 Path.rename() 在 Python 中重命名文件
Python
pathlib
是一个用于处理文件系统路径的面向对象框架。如果您想知道如何在 pathlib 和 os 模块之间进行选择,那么有几个关键区别。
os 模块使用字符串表示路径,同时
pathlib
创建目录对象。使用
pathlib
可以提高代码的可读性和可维护性,以及可移植到不同的操作系统。
让我们用 重命名一个文件
pathlib
。在此示例中,我们将拍摄一张新照片并使用 重命名
pathlib
。如您所见,我们的图片名称目前不太易读。
那么,让我们编写脚本。
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')
请参见下面的结果。
我们的文件名现在是
shooting_star.jpg
。您可以
在此处
以及
有关在 Python 中处理文件和目录的课程
pathlib 库的更多信息,以在 Python 中重命名文件
.
使用 os.rename() 和 os.listdir() 在 Python 中批量重命名文件
我们可以逐个重命名文件,但如果文件很多,这可能会变得繁琐和/或不可能。想象一下,您必须准备一个包含数千张图片的数据集来训练计算机视觉模型。这根本不可能手动完成。
相反,我们可以用 Python 批量重命名文件。让我们选择一个包含数百张图片的文件夹,使用 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)
让我们检查一下结果:
我们的图片已成功重命名。如果您想了解更多信息
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 文件夹:
在此处
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
,...
让我们编写脚本来重命名它们全部。
# 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
结果如下:
建议使用
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
以下是最终结果:
使用 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()
:
下面是使用以下命令的输出
glob.iglob()
:
我们的代码正确识别了要重命名的图片。所以,让我们重命名图片。有了
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
等。请根据需要随意更改位数。
以下是最终结果:
如果您愿意
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
以下是最终结果:
您可以在
glob.glob()
此处
和
glob.iglob()
此处
。 不要忘记查看我们的课程,了解
如何使用 Python 处理文件和目录
.
使用 os.walk(cwd) 在 Python 中批量重命名文件
让我们让它更复杂一点。我们还可以从嵌套目录中获取文件,重命名它们,并将它们移动到单个目录中。让我们用
os.walk(cwd)
.
os.walk()
通过自上而下或自下而上遍历目录树来生成目录树中的文件名。然后,它会生成一个包含三个元素的元组 (
dir_path
,
dir_names
,
file_names
)。
这次,我在两个不同的文件夹中有图片,分别名为
data1
和
data2
。我想重命名它们并将它们全部移动到名为
all
.
这是我的
data1
文件夹:
这是我的
data2
文件夹:
让我们写一些代码:
# 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
结果如下:
因此,我们的
data1
和
data2
文件夹现在是空的,并且我们的图片已被重命名并移动到所有文件夹。
在此处
os.walk()
了解更多信息
。您还可以查看我们
关于使用 Python 处理文件和目录的
.
结束语
我们在本文中涵盖了很多内容!我们学习了多种方法:
- 在 Python 中重命名文件
- 使用 Python 移动文件
- 使用 Python 批量重命名文件
- 使用 Python 批量移动文件
请不要犹豫,重用上面的代码来帮助你入门。使用代码并开始使用 Python 自动执行一些重复任务。
为了将您的 Python 编程技能提升到更高的水平,请不要忘记查看我们的 Python 编程轨迹 和 !
发表评论 取消回复