目录
20-1 文件创建和删除
20-2 文件创建和删除(pathlib模块)
20-3 创建和删除目录
20-4 创建和删除目录(pathlib 模块)
20-5 获取目录中包含的文件和目录的列表
20-6 获取目录中包含的文件和目录列表(pathlib 模块)
20-7 检查文件或目录是否存在
20-8 检查文件和目录是否存在(pathlib 模块)
20-9 获取符合条件的文件和目录列表
20-10 获取符合条件的文件和目录列表(pathlib 模块)
20-11 重命名文件或目录
20-12 重命名文件或目录(pathlib 模块)
这一章,我们主要解释如何使用 Python 内置的 open 函数创建一个新文件,以及如何使用 os 模块提供的 os.remove 函数删除一个已经创建的文件。
创建一个文件
要创建一个新的空文件,请使用内置的open功能。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open函数是打开文件读取或写入文件的函数,但是open函数在“w”模式下打开时,如果指定路径指示的文件不存在,则会创建一个新文件。
具体写如下。
import os
path = './test/uesr.txt'
f = open(path, 'w')
f.write('') #不写任何内容创建的文件
f.close()
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample11.py。
import os
f = open('./test/user.txt', 'w')
f.close()
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample11.py
指定路径指示的文件已创建。
删除文件
要删除现有文件,请使用 os 模块提供的 remove 函数。
os.remove(path, *, dir_fd=None)
删除第一个参数中指定的路径所指示的文件。
具体写如下。
import os
path = './test/name.txt'
os.remove(path)
尝试删除不存在的文件将引发 FileNotFoundError。
import os
path = './test/name2.txt'
os.remove(path)
>> FileNotFoundError: [WinError 2] : 访问被拒绝'./test/name2.txt'
remove 方法只能删除文件。如果路径是目录,则引发 PermissionError。
import os
path = './test/img'
os.remove(path)
>> PermissionError: [WinError 5] 访问被拒绝。: './test/img'
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample12.py。
import os
os.remove('./test/user.txt')
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample12.py
指定路径指示的文件已被删除。
我们讲解了如何使用 Python 的 open 函数创建一个新文件,以及如何使用 os.remove 方法删除一个已经创建的文件。
我们将解释如何使用 Python 的 pathlib 模块提供的 Path.touch 方法创建一个新文件,以及如何使用 Path.unlink 方法删除一个已经创建的文件。
创建一个文件
要创建一个新的空文件,请使用 pathlib 模块提供的 Path 类的 touch 方法。
Path.touch(mode=0o666, exist_ok=True)
创建一个由路径指示的新文件。可选的第一个参数设置要创建的文件的权限(如果省略,则以八进制设置 0o666)。
至于实际使用,首先从指示要创建的文件的路径创建Path类的实例。然后它执行触摸方法。
import pathlib
p = pathlib.Path('./test/uesr.txt')
p.touch()
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample13.py。
import pathlib
p = pathlib.Path('./test/client.txt')
p.touch()
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample13.py
指定路径指示的文件已创建。
删除文件
要删除现有文件,请使用 pathlib 模块提供的 Path 类的 unlink 方法。
Path.unlink(missing_ok=False)
删除路径指示的文件。如果可选的第一个参数为 True,则如果目标文件不存在则不会发生错误。
至于实际使用,首先从指示要创建的文件的路径创建Path类的实例。然后运行unlink方法。
import pathlib
p = pathlib.Path('./test/uesr.txt')
p.unlink()
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample14.py。
import pathlib
p = pathlib.Path('./test/client.txt')
p.unlink()
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample14.py
指定路径指示的文件已被删除。
如何使用 Python 的 os 模块提供的 os.mkdir 和 os.makedirs 函数创建新目录,如何删除已经使用 os.rmdir 函数创建的目录,以及提供的 shutil 模块我将解释如何删除目录和使用 shutil.rmtree 函数将其内容组合在一起。
创建一个目录
要创建新目录,请使用 os 模块提供的 mkdir 函数。
os.mkdir(path, mode=0o777, *, dir_fd=None)
创建由第一个参数中指定的路径指示的目录。可选的第二个参数设置创建目录的权限(如果省略,则八进制为 0o777)。
例如:
import os
path = './test/movie'
os.mkdir(path)
mkdir 函数不能创建中间目录。比如创建目录c:\test\image\back\2023,如果c:\test\image\back目录不存在,就会出现FileNotFoundError。
import os
path = './test/image/back/2023'
os.mkdir(path)
>> FileNotFoundError: [WinError 3] 找不到指定的路径。:
'./test/image/back/2023'
此外,如果您尝试创建的目录已经创建,则会发生 FileExistsError。
import os
path = './test/img'
os.mkdir(path)
>> FileExistsError: [WinError 183] 无法创建已存在的文件。:
'./test/img'
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample15.py。
import os
path = './test/movie'
os.mkdir(path)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
その後で、次のように実行してください。
python sample15.py
指定のパスが示すディレクトリが新しく作成されました。
同时创建一个中间目录
另一种创建目录的方法是使用 os 模块提供的 makedirs 函数。如果需要,makedirs 函数还会创建中间目录。
os.makedirs(name, mode=0o777, exist_ok=False)
创建由第一个参数中指定的路径指示的目录。可选的第二个参数设置创建目录的权限(如果省略,则八进制为 0o777)。如果要创建的目录已经存在,可选的第三个参数 True 可以防止错误。
例如:
import os
path = './test/movie'
os.makedirs(path)
对于 makedirs 函数,它会在必要时自动创建中间目录。例如创建目录’./test/movie/back/2022’时,如果’./test/movie/back’目录不存在,则先创建中间目录’./test/movie/back’后创建目录,创建指定路径的目录。
import os
path = './test/movie/back/2022'
os.makedirs(path)
此外,如果您尝试创建的目录已经创建,则省略参数或显式设置 exist_ok=False 将引发 FileExistsError 。如果在参数中设置 exist_ok=True,即使目录已经存在也不会出现错误。
import os
path = './test/movie'
os.makedirs(path, exist_ok=True)
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample16.py。
import os
path = './test/code/python/2022'
os.makedirs(path, exist_ok=True)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample16.py
我分别创建了一个python目录,它是2022目录的父目录,以及一个code目录,它是python目录的父目录。
删除目录
要删除目录,请使用 os 模块提供的 rmdir 函数。
os.rmdir(path, *, dir_fd=None)
删除第一个参数中指定的路径所指示的目录。要删除目录,目录的内容必须为空。
例如:
import os
path = './test/movie'
os.rmdir(path)
如果要删除的目录不为空,则会引发 OSError。
import os
path = './test/doc'
os.rmdir(path)
>> OSError: [WinError 145] 目录不为空。: './test/doc'
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample17.py。
import os
path = './test/movie'
os.rmdir(path)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
路径指示的目录已被删除。
一次删除目录及其内容
使用shutil模块提供的rmtree函数删除目录下的所有文件。
shutil.rmtree(path, ignore_errors=False, onerror=None)
删除第一个参数中指定的路径所指示的目录。如果目录中包含文件或目录,它们将被一起删除。
例如:
import shutil
path = './test/movie'
shutil.rmtree(path)
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample18.py。
import shutil
path = './test/movie'
shutil.rmtree(path)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中是一个电影目录。
电影目录包含一些文件和目录。该目录还包含文件。
然后运行:
python sample18.py
路径指示的目录已连同该目录中存储的文件一起被删除。
我们将解释如何使用 Python 的 pathlib 模块提供的 Path.mkdir 方法创建一个新目录,以及如何删除一个已经使用 Path.rmdir 方法创建的目录。
创建一个目录
要创建新目录,请使用 pathlib 模块提供的 Path 类的 mkdir 方法。
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
创建一个目录。可选的第一个参数设置要创建的目录的权限(如果省略,默认为八进制的 0o777)。如果可选的第二个参数设置为 True,则自动创建中间目录。如果可选的第三个参数设置为 True,如果要创建的目录已经存在,则不会发生错误。
至于实际使用,首先从指示要创建的目录的路径创建Path CLASS的实例。然后运行 mkdir 方法。
import pathlib
p = pathlib.Path('./test/back')
p.mkdir()
mkdir 方法会在必要时自动创建中间目录。例如创建目录’./test/movie/back/2022’时,如果’./test/movie/back’目录不存在,则先创建中间目录’./test/movie/back’后创建目录,创建指定路径的目录。
import pathlib
p = pathlib.Path('./test/movie/back/2022')
p.mkdir(parents=True)
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample19.py。
import pathlib
p = pathlib.Path('./test/code/python/2022')
p.mkdir(parents=True)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample19.py。
我分别创建了一个java目录,它是2020目录的父目录,和一个代码目录,它是python目录的父目录。
删除目录
要删除目录,请使用 pathlib 模块提供的 Path 类的 rmdir 方法。
Path.rmdir()
删除目录。该目录应该是空的。
实际使用时,首先从表示要删除的目录的路径创建Path类的实例。然后运行 rmdir 方法。
import pathlib
p = pathlib.Path('./test/movie')
p.rmdir()
如果要删除的目录不为空,则会引发 OSError。
import pathlib
p = pathlib.Path('./test/movie')
p.rmdir()
>> OSError: [WinError 145] 目录不为空。: 'test\\doc'
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample20.py。
import pathlib
p = pathlib.Path('./test/back')
p.rmdir()
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample20.py
路径指示的目录已被删除。
我们解释了如何使用 Python 的 pathlib 模块创建新目录以及如何删除已创建的目录。
我们将解释如何使用 Python 的 os 模块提供的 os.listdir 函数获取指定目录中包含的文件和目录名称的列表。它还解释了如何使用 os.path.isfile 和 os.path.isdir 函数来确定对象是文件还是目录。
获取文件和目录列表
要获取给定目录中包含的文件和目录的列表,请使用 os 模块中的 listdir 函数。格式如下。
os.listdir(path='.')
如果您指定一个目录作为参数,它将返回一个列表,其中包含该目录中包含的文件名和目录名作为元素。
例如:
import os
path = './test/'
filelist = os.listdir(path)
print(filelist)
>> ['address.txt', 'doc', 'img', 'name.txt']
文件名和目录名都作为元素存储在列表中,没有区别。
路径可以通过参数中指定的目录名与获取的文件名或目录名组合得到,此时可以使用os.path模块中提供的join函数,这样做比较方便。
os.path.join(path, *paths)
如果您指定多个路径元素作为参数,它将返回将它们与目录分隔符连接起来的结果。请参阅下面的示例以了解实际使用情况。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample21.py。
import os
path = './test/'
filelist = os.listdir(path)
for f in filelist:
print(f)
print(os.path.join(path, f))
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample20.py
获取指定路径中包含的文件名或目录名以及各路径,并输出到屏幕。
检查它是文件还是目录
要检查给定路径是文件还是目录,请使用 os.path 模块提供的 isfile 和 isdir 函数。
os.path.isfile(path)
如果参数中指定的路径确实存在并且是一个文件,则返回 True。
os.path.isdir(path)
如果参数中指定的路径确实存在并且是一个目录,则返回 True。
如果它们实际上不存在,则这两个函数都返回 False。
例如:
import os
path = './test/'
print(os.path.isfile(path))
>> False
print(os.path.isdir(path))
>> True
path = './test/address.txt'
print(os.path.isfile(path))
>> True
print(os.path.isdir(path))
>> False
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample22.py。
import os
path = './test/'
filelist = os.listdir(path)
for f in filelist:
if os.path.isfile(os.path.join(path, f)):
print('[F]:' + f)
else:
print('[D]:' + f)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample22.py
检查指定路径中包含的文件或目录是否为文件或目录并显示。
还获取有关文件和目录的信息
获取给定目录中文件和目录列表的另一种方法是使用 os 模块中的 scandir 函数。格式如下。
os.scandir(path='.')
给定路径作为参数,返回 os.DirEntry 对象的迭代器,其中包含有关该路径中包含的文件和目录的信息。它不仅包含文件或目录的名称,还包含有关它是文件还是目录的信息,以及文件的大小和创建时间等信息。
可以通过引用os.DirEntry类的name属性获取文件名或目录名,通过引用path属性获取路径。
例如:
import os
path = './test/'
itr = os.scandir(path)
f = next(itr)
print(f.name)
>> address.txt
print(f.path)
>> ./test/address.txt
我们从迭代器中取出一个元素,分别输出文件名和路径。
也可以通过os.DirEntry类提供的isfile方法或isdir方法来判断是文件还是目录。
is_file(*, follow_symlinks=True)
如果此项实际存在并且是文件或文件的符号链接,则返回 True。
is_dir(*, follow_symlinks=True)
如果此项实际存在并且是目录或目录的符号链接,则返回 True。
例如:
import os
path = './test/'
itr = os.scandir(path)
f = next(itr)
print(f.name)
>> address.txt
print(f.is_file())
>> True
print(f.is_dir())
>> False
我们从迭代器中取出一个元素并打印出文件名或目录名以及它是文件还是目录。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample23.py。
import os
path = './test/'
for i in os.scandir(path):
if i.is_file():
print('[F]:' + i.name + ' ' + i.path)
else:
print('[D]:' + i.name + ' ' + i.path)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample23.py
获取指定路径中包含的文件名或目录名以及各路径,并输出到屏幕。
我将解释如何使用 Python 的 pathlib 模块提供的 Path.iterdir 方法获取指定目录中包含的文件和目录名称的列表。它还解释了如何使用 Path.is_file 和 Path.is_dir 方法来确定对象是文件还是目录。
获取文件和目录列表
要获取指定目录中的文件和目录列表,请使用 pathlib 模块提供的 Path 类的 iterdir 方法。格式如下。
Path.iterdir()
返回 Path 对象的迭代器,这些对象表示路径指示的目录中包含的文件和目录。
例如:
import pathlib
p = pathlib.Path('./test/')
itr = p.iterdir()
childp = next(itr)
print(childp)
>> address.txt
从迭代器中取出一个元素并打印路径。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample24.py。
import pathlib
p = pathlib.Path('./test/')
for i in p.iterdir():
print(i)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample24.py
获取指定路径中包含的文件名或目录名以及各路径,并输出到屏幕。
检查它是文件还是目录
判断指定路径是文件还是目录,使用pathlib模块提供的Path类的is_file和is_dir方法。格式如下。
Path.is_file()
如果参数中指定的路径确实存在并且是一个文件,则返回 True。
Path.is_dir()
如果参数中指定的路径确实存在并且是一个目录,则返回 True。
如果它们实际上不存在,则这两种方法都返回 False。
例如:
import pathlib
p = pathlib.Path('./test/')
for i in p.iterdir():
if i.is_file():
print(str(i) + ' is File')
else:
print(str(i) + ' is Directory')
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample25.py。
import pathlib
p = pathlib.Path('./test/')
for i in p.iterdir():
if i.is_file():
print('[F]:' + str(i))
else:
print('[D]:' + str(i))
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample25.py
检查指定路径中包含的文件或目录是否为文件或目录并显示。
有时在执行诸如读取或复制文件之类的操作之前,有必要检查文件是否实际存在。在这里,我将解释如何使用Python的os模块提供的os.path.exists函数检查指定路径指示的文件或目录是否实际存在。
检查文件或目录是否存在
要检查指定路径指示的文件或目录是否存在,请使用 os.path 模块提供的 exists 函数。
os.path.exists(path)
如果给定路径确实存在,则返回 True。
例如:
import os
path = './test/img/'
print(os.path.exists(path))
>> True
path = './test/address.txt'
print(os.path.exists(path))
>> True
如果指定为参数的路径确实存在,则 exists 函数返回 True,无论它是文件还是目录。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample25.py。
import os
import pathlib
path1 = './test/address.txt'
if os.path.exists(path1) :
print(path1 + '存在')
else :
print(path1 + '不存在')
path2 = './test/user.txt'
if os.path.exists(path2) :
print(path2 + '存在')
else :
print(path2 + '不存在')
path3 = './test/img'
if os.path.exists(path3) :
print(path3 + '存在')
else :
print(path3 + '不存在')
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample25.py
指定了三个路径并检查了每个路径是否存在。
有时在执行诸如读取或复制文件之类的操作之前,有必要检查文件是否实际存在。在这里,我们将介绍如何使用Python 的pathlib 模块提供的Path.exists 方法来检查指定路径指示的文件或目录是否实际存在。
检查文件或目录是否存在
要检查指定路径指示的文件或目录是否存在,可以使用pathlib模块提供的Path类的exists方法。
Path.exists()
返回 path 指示的文件或目录是否实际存在。
至于实际使用,首先从要检查其存在的路径中创建 Path 类的实例。然后它执行 exists 方法。
import pathlib
p = pathlib.Path('./test/movie')
print(p.exists())
如果路径实际上是文件或目录,则返回 True。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample26.py。
import pathlib
path1 = './test/address.txt'
p1 = pathlib.Path(path1)
if p1.exists() :
print(path1 + '存在')
else :
print(path1 + '不存在')
path2 = './test/user.txt'
p2 = pathlib.Path(path2)
if p2.exists() :
print(path2 + '存在')
else :
print(path2 + '不存在')
path3 = './test/img'
p3 = pathlib.Path(path3)
if p3.exists() :
print(path3 + '存在')
else :
print(path3 + '不存在')
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample126.py
指定了三个路径并检查了每个路径是否存在。
我将解释如何使用 Python 的 glob 模块提供的 glob 函数来获取符合指定条件的文件和目录列表。
获取符合条件的文件和目录
使用 glob 模块提供的 glob 函数获取符合指定条件的文件和目录列表。
glob.glob(pathname, *, recursive=False)
获取一个列表,其中包含与添加为元素的第一个参数中指定的路径相匹配的文件和目录。这时,您可以在路径中指定以下特殊字符。
* 0个或多个任意字符
? 任何单个字符
[abc] 括号中的任意字符
我们将看看如何使用每一个。
*: 0个或多个任意字符
[ * ] 匹配任意 0 个或多个字符。例如,如果您指定 *.txt 作为路径,您可以获得与任何包含 0 个或多个字符的字符串(例如 a.txt 或 memo.txt + ‘.txt’)相匹配的文件和目录列表。
下面会得到一个以.txt结尾的文件和目录的列表。
import glob
for name in glob.glob('./test/*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
下面会得到b开头的文件和目录列表。
import glob
for name in glob.glob('./test/b*'):
print(name)
>> ./test\back
>> ./test\book.png
>> ./test\book.txt
?:任何单个字符
[ ? ]匹配任何字符,1 个或多个。例如,如果您指定 ?.txt 作为路径,您可以获得与任何一个或多个字符的字符串(例如 a.txt 或 b.txt + ‘.txt’)相匹配的文件和目录列表。它不匹配 abc.txt 之类的非单个字符的内容。
下面会得到一个以任意三个字符开头,以.txt结尾的文件和目录的列表。
import glob
for name in glob.glob('./test/???.txt'):
print(name)
>> ./test\cup.txt
>> ./test\pen.txt
[abc]: 括号内任意字符
[] 匹配括号中的任何一个字符。例如,如果您指定 199[789].txt 作为路径,您将获得与 1997.txt、1998.txt 和 1999.txt 匹配的文件和目录列表。它不匹配 abc.txt 之类的非单个字符的内容。
您还可以通过编写 [3-6] 或 [ae] 等连字符来指定字符范围。[3-6] 与 [3456] 相同,[ae] 与 [abcde] 相同。
以下获取文件和目录列表,这些文件和目录首先以字母 a 到 e 开头,后跟任意字母并以 .txt 结尾,然后以字母 c 到 z 开头,后跟任意字母 获取以结尾的文件和目录列表
import glob
for name in glob.glob('./test/[a-e]*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
for name in glob.glob('./test/[c-z]*.txt'):
print(name)
>> ./test\cup.txt
>> ./test\pen.txt
将特殊字符视为字符
* ?[] 在glob函数中有特殊含义,但要将这些字符视为简单字符,将它们括在[]中。例如,如果您希望将 * 作为一个字符而不是任何 0 个或多个字符进行匹配,请写成 [*] 。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample27.py。
import glob
print(glob.glob('./test/*.txt'))
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample27.py
获取与指定路径匹配的文件和目录的列表。
获取包含子目录的列表
在 glob 函数参数中指定 recursive=True 允许 ** 作为特殊字符。
glob.glob(pathname, *, recursive=False)
在路径中使用 ** 将匹配所有文件、零个或多个目录和子目录。例如指定./**/*.txt为路径,则除了当前目录下的文件,./doc/b.txt和./外,还会显示a.txt、memo.txt等doc/back/2020/report.txt等子目录下的文件也包括在内。
import glob
for name in glob.glob('./test/**/*.txt', recursive=True):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
>> ./test\back\2020.txt
>> ./test\back\2021.txt
>> ./test\back\2022.txt
>> ./test\back\old\2019.txt
递归搜索子目录以获取符合条件的文件。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample28.py。
import glob
print(glob.glob('./test/**/*.txt', recursive=True))
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample28.py
获取与指定路径匹配的文件和目录列表,包括子目录。
获取迭代器而不是包含所有匹配文件和目录的列表
glob 函数返回一个包含所有匹配文件和目录的列表,但您可以获得一个迭代器,而不是返回一个列表,它可以顺序访问匹配的文件和目录。使用 iglob 函数而不是 glob 函数。
glob.iglob(pathname, *, recursive=False)
用法与 glob 函数相同,只是它返回一个迭代器而不是列表。
你实际上会这样写:
import glob
for name in glob.iglob('./test/**/*.txt', recursive=True):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
>> ./test\back\2018.txt
>> ./test\back\2019.txt
>> ./test\back\2020.txt
>> ./test\back\2021.txt
>> ./test\back\2022.txt
>> ./test\back\old\2017.txt
如果大量文件或目录匹配,使用迭代器获取每个结果而不是一次获取所有结果可以减少执行环境的负担。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample29.py。
import glob
for name in glob.iglob('./test/**/*.txt', recursive=True):
print(name)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample29.py
按顺序检索与指定路径匹配的文件和目录,包括子目录。
说明如何使用Python的pathlib模块提供的Path.glob方法获取符合指定条件的文件和目录列表。
获取符合条件的文件和目录
要获取符合指定条件的文件和目录列表,请使用 pathlib 模块提供的 Path.glob 方法。
Path.glob(pattern)
获取一个迭代器,该迭代器可以顺序访问路径指示的目录及其子目录中包含的文件和目录中与第一个参数中指定的模式匹配的文件和目录。这时,您可以在模式中指定以下特殊字符。
* 0个或多个任意字符
? 任何单个字符
[abc] 括号中的任意字符
我们将看看如何使用每一个。
*: 0个或多个任意字符
* 匹配任意 0 个或多个字符。例如,如果您指定 *.txt 作为路径,您可以获得与任何包含 0 个或多个字符的字符串(例如 a.txt 或 memo.txt + ‘.txt’)相匹配的文件和目录列表。
下面会得到一个以.txt结尾的文件和目录的列表。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
下面会得到b开头的文件和目录列表。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('b*'):
print(name)
>> ./test\back
>> ./test\book.png
>> ./test\book.txt
?:任何单个字符
? 匹配任何字符,1 个或多个。例如,如果您指定 ?.txt 作为路径,您可以获得与任何一个或多个字符的字符串(例如 a.txt 或 b.txt + ‘.txt’)相匹配的文件和目录列表。它不匹配 abc.txt 之类的非单个字符的内容。
下面会得到一个以任意三个字符开头,以.txt结尾的文件和目录的列表。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('???.txt'):
print(name)
>> ./test\cup.txt
>> ./test\pen.txt
[abc]: 括号内任意字符
[] 匹配括号中的任何一个字符。例如指定199[789].txt作为路径,可以得到匹配1997.txt、1998.txt、1999.txt的文件和目录列表。它不匹配 abc.txt 之类的非单个字符的内容。
您还可以通过编写 [3-6] 或 [ae] 等连字符来指定字符范围。[3-6] 与 [3456] 相同,[ae] 与 [abcde] 相同。
以下获取文件和目录列表,这些文件和目录首先以字母 a 到 e 开头,后跟任意字母并以 .txt 结尾,然后以字母 c 到 z 开头,后跟任意字母 获取以结尾的文件和目录列表。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('[a-e]*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
for name in p.glob('[c-z]*.txt'):
print(name)
>> ./test\cup.txt
>> ./test\pen.txt
将特殊字符视为字符
* ?[]在glob函数中有特殊含义,但要将这些字符视为简单字符,将它们括在[]中。例如,如果您希望将 * 作为一个字符而不是任何 0 个或多个字符进行匹配,请编写 [*] 。
获取匹配的文件和目录,包括子目录
在模式中使用 ** 将匹配零个或多个目录和子目录。比如**/*.txt指定为pattern,a.txt,memo.txt等。除了当前目录下的文件,./doc/b.txt,./doc/back/2020 /report.txt 等。子目录中的文件也包括在内。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('**/*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
>> ./test\back\2018.txt
>> ./test\back\2019.txt
>> ./test\back\2020.txt
>> ./test\back\2021.txt
>> ./test\back\2022.txt
>> ./test\back\old\2017.txt
递归搜索子目录以获取符合条件的文件。
* 与glob模块中的glob函数不同,它默认递归搜索子目录。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample30.py。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('**/*.txt'):
print(name)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample30.py
按顺序检索与指定模式匹配的文件和目录,包括子目录。
解释如何使用 Python 的 os 模块提供的重命名函数重命名文件或目录。
重命名文件或目录
对于文件名或目录名,请使用 os 模块提供的重命名功能。
os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
将第一个自变量指定的路径指示的文件名或目录名更改为第二个自变量指定的路径指示的文件名或目录名。
例如:以下是更改文件名时的情况。
import os
oldpath = './test/book.txt'
newpath = './test/memo.txt'
os.rename(oldpath, newpath)
重命名文件时,即使更改前后文件的目录不同也没有问题。
import os
oldpath = './test/book.txt'
newpath = './test/back/memo.txt'
os.rename(oldpath, newpath)
但是,如果更改的目录不存在,则会发生 FileNotFoundError。
import os
oldpath = './test/book.txt'
newpath = './back/memo.txt'
os.rename(oldpath, newpath)
>> FileNotFoundError: [WinError 3] 找不到指定的路径。:
'./test/book.txt' -> './back/memo.txt'
重命名目录时也是如此。
import os
oldpath = './test/back'
newpath = './test/old'
os.rename(oldpath, newpath)
重命名目录时,即使在更改前后更改目录的父目录也没有问题。
import os
oldpath = './test/back'
newpath = './test/img/back'
os.rename(oldpath, newpath)
但是,如果更改目录的父目录不存在,则会发生 FileNotFoundError。
import os
oldpath = './test/back'
newpath = './test/log/back'
os.rename(oldpath, newpath)
>> FileNotFoundError: [WinError 3] 找不到指定的路径。:
'./test/back' -> './test/log/back'
在 Windows 环境下,如果更改的路径已经存在,则会发生 FileExistsError。
import os
oldpath = './test/book.txt'
newpath = './test/address.txt'
os.rename(oldpath, newpath)
>> FileExistsError: [WinError 183] 无法创建已存在的文件。:
'./test/book.txt' -> './test/address.txt'
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample31.py。
import os
oldpath = './test/book.txt'
newpath = './test/memo.txt'
os.rename(oldpath, newpath)
oldpath = './test/back'
newpath = './test/old'
os.rename(oldpath, newpath)
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample31.py
文件名和目录名分别改变了。
我将解释如何使用 Python 的 pathlib 模块提供的 Path.rename 方法重命名文件或目录。
重命名文件或目录
要重命名文件或目录,请使用 pathlib 模块提供的 Path.rename 函数。
Path.rename(target)
将路径所示的文件名或目录名变更为自变量中指定的路径所示的文件名或目录名。
例如:以下是更改文件名时的情况。
import pathlib
oldpath = pathlib.Path('./test/book.txt')
oldpath.rename(pathlib.Path('./test/memo.txt'))
重命名文件时,即使更改前后文件的目录不同也没有问题。
import pathlib
oldpath = pathlib.Path('./test/book.txt')
oldpath.rename(pathlib.Path('./test/back/memo.txt'))
但是,如果更改的目录不存在,则会发生 FileNotFoundError。
import pathlib
oldpath = pathlib.Path('./test/book.txt')
oldpath.rename(pathlib.Path('./back/memo.txt'))
>> FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: 'test\\book.txt' -> 'back\\memo.txt'
重命名目录时也是如此。
import pathlib
oldpath = pathlib.Path('./test/back')
oldpath.rename(pathlib.Path('./test/old'))
重命名目录时,即使在更改前后更改目录的父目录也没有问题。
import pathlib
oldpath = pathlib.Path('./test/back')
oldpath.rename(pathlib.Path('./test/img/old'))
但是,如果更改目录的父目录不存在,则会发生 FileNotFoundError。
import pathlib
oldpath = pathlib.Path('./test/back')
oldpath.rename(pathlib.Path('./test/log/old'))
>> FileNotFoundError: [WinError 3] 找不到指定的路径。: 'test\\back' -> 'test\\log\\old'
在 Windows 环境下,如果更改的路径已经存在,则会发生 FileExistsError。
import pathlib
oldpath = pathlib.Path('./test/book.txt')
oldpath.rename(pathlib.Path('./test/address.txt'))
>> FileExistsError: [WinError 183] 文件已经存在不能创建。:
'test\\book.txt' -> 'test\\address.txt'
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample32.py。
import pathlib
oldpath = pathlib.Path('./test/book.txt')
oldpath.rename(pathlib.Path('./test/memo.txt'))
oldpath = pathlib.Path('./test/back')
oldpath.rename(pathlib.Path('./test/old'))
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中包含如下文件和目录:
然后运行:
python sample32.py
文件名和目录名分别改变了。