在Python使用过程中免不了与本地文件的一些交互,中间涉及到文件目录的访问,文件的读写等。先前整理过一篇Python文件的读写操作,今天主要从标准库的角度重新梳理,完善现有的知识体系。
pathlib:面向对象的文件系统路径
pathlib 模块是 Python 3.4 及以后的版本中引入的一个模块,用于简化和优化文件系统路径的操作。它提供了面向对象的 API,使得文件路径的操作更加直观和易于使用。pathlib 通过 Path 类及其子类提供了一种跨平台的方式来处理文件系统路径,使代码更加清晰和简洁。
主要功能
- 路径创建和操作:创建、组合、解析路径,检查路径属性等。
- 文件和目录操作:创建、删除、重命名文件和目录,读取和写入文件等。
- 路径操作:处理路径的不同部分,如文件名、扩展名、父目录等。
- 跨平台兼容:统一路径操作接口,兼容不同操作系统(Windows、Unix、Linux等)。
使用场景
- 文件系统路径处理:创建、操作、查询文件和目录路径。
- 跨平台路径操作:处理不同操作系统上的路径兼容问题。
- 文件和目录操作:创建、删除、重命名文件和目录。
- 数据处理:读取和写入文件内容。
Path 类
Path 类是 pathlib 模块的核心类,用于表示文件系统中的路径。Path 对象可以是文件或目录的路径。
创建 Path 对象
from pathlib import Path # 创建当前目录的 Path 对象 p = Path('.') # 创建特定路径的 Path 对象 p = Path('/home/user/documents')
路径属性
- name:返回路径的文件名(不包括父目录)。
- stem:返回文件名(不包括扩展名)。
- suffix:返回文件扩展名(包括点)。
- parent:返回路径的父目录。
- parts:返回路径的各部分组成的元组。
from pathlib import Path p = Path('/home/user/documents/file.txt') print(p.name) # 输出: file.txt print(p.stem) # 输出: file print(p.suffix) # 输出: .txt print(p.parent) # 输出: /home/user/documents print(p.parts) # 输出: ('/', 'home', 'user', 'documents', 'file.txt')
路径操作
- joinpath(*args):连接路径的不同部分。
- relative_to(*args):返回相对路径。
- with_name(name):返回修改后的路径,文件名部分被替换为 name。
- with_suffix(suffix):返回修改后的路径,扩展名被替换为 suffix。
from pathlib import Path p = Path('/home/user/documents/file.txt') print(p.joinpath('new_file.txt')) # 输出: /home/user/documents/new_file.txt print(p.relative_to('/home/user')) # 输出: documents/file.txt print(p.with_name('new_file.txt')) # 输出: /home/user/documents/new_file.txt print(p.with_suffix('.md')) # 输出: /home/user/documents/file.md
文件和目录操作
- exists():检查路径是否存在。
- is_file():检查路径是否是文件。
- is_dir():检查路径是否是目录。
- mkdir(parents=False, exist_ok=False):创建目录,parents 参数用于创建父目录,exist_ok 参数用于忽略已存在的目录。
- rename(target):重命名或移动文件/目录。
- unlink():删除文件。
- rmdir():删除空目录。
- rmdir():删除空目录。
from pathlib import Path p = Path('/home/user/documents/file.txt') if p.exists(): print('File exists') if p.is_file(): print('It is a file') if p.is_dir(): print('It is a directory') # 创建目录 p = Path('/home/user/new_directory') p.mkdir(parents=True, exist_ok=True) # 重命名 p.rename('/home/user/renamed_file.txt') # 删除文件 p.unlink()
文件读写操作
- read_text(encoding=None):读取文件内容并以字符串形式返回。
- write_text(data, encoding=None):将字符串数据写入文件。
- read_bytes():读取文件内容并以字节形式返回。
- write_bytes(data):将字节数据写入文件。
from pathlib import Path p = Path('/home/user/documents/file.txt') # 写入文件 p.write_text('Hello, World!') # 读取文件 content = p.read_text() print(content) # 输出: Hello, World!
目录遍历
- iterdir():返回目录中所有文件和子目录的生成器。
- glob(pattern):根据模式(支持 Unix 样式的路径匹配)返回匹配的文件。
- rglob(pattern):递归地返回所有匹配模式的文件。
from pathlib import Path p = Path('/home/user/documents') # 遍历目录 for file in p.iterdir(): print(file.name) # 根据模式匹配 for file in p.glob('*.txt'): print(file.name) # 递归匹配 for file in p.rglob('*.txt'): print(file.name)
os.path:常见的路径操作
os.path 是 Python 标准库中的一个子模块,提供了一系列函数用于处理和操作文件系统路径。尽管 Python 3.4 之后推荐使用 pathlib 模块来处理路径,但 os.path 仍然在许多现有代码中被广泛使用。os.path 主要提供了对路径的操作和查询功能,包括路径的拼接、分离、标准化、判断等。
主要功能
- 路径操作:路径拼接、分离、规范化等。
- 路径查询:检查路径属性(如是否是文件或目录)。
- 路径规范化:处理路径中的特殊字符(如 . 和 ..)。
- 路径信息:获取路径的各种信息,如文件名、扩展名等。
使用场景
- 文件和目录操作:处理路径相关的操作,例如拼接路径、查询文件和目录属性等。
- 跨平台路径处理:确保代码在不同操作系统上能够正确处理路径。
- 路径规范化:规范化路径,消除多余的路径符号和环境变量。
路径操作
- path.join(*paths):将多个路径拼接成一个路径。该函数根据操作系统的路径分隔符(如 / 或 \)自动拼接路径。
- path.split(path):将路径拆分为目录部分和文件名部分。返回一个元组 (head, tail)。
- path.splitext(path):将路径拆分为文件名和扩展名部分。返回一个元组 (root, ext)。
import os path = os.path.join('folder', 'subfolder', 'file.txt') print(path) # 在 Unix 上输出: folder/subfolder/file.txt head, tail = os.path.split('/home/user/file.txt') print(head) # 输出: /home/user print(tail) # 输出: file.txt root, ext = os.path.splitext('/home/user/file.txt') print(root) # 输出: /home/user/file print(ext) # 输出: .txt
路径查询
- path.exists(path):检查路径是否存在。
- path.isfile(path):检查路径是否是一个文件。
- path.isdir(path):检查路径是否是一个目录。
- path.isabs(path):检查路径是否是绝对路径。
import os print(os.path.exists('/home/user/file.txt')) # 输出: True/False print(os.path.isfile('/home/user/file.txt')) # 输出: True/False print(os.path.isdir('/home/user')) # 输出: True/False print(os.path.isabs('/home/user')) # 输出: True print(os.path.isabs('file.txt')) # 输出: False
路径规范化
- path.abspath(path):返回路径的绝对路径。
- path.normpath(path):规范化路径,消除多余的分隔符和上级目录符号 (..)。
- path.expanduser(path):将路径中的 ~ 展开为用户的主目录。
- path.expandvars(path):将路径中的环境变量(如 $HOME)展开。
import os print(os.path.abspath('file.txt')) # 输出: /current/working/directory/file.txt path = os.path.normpath('/home/user/./file.txt') print(path) # 输出: /home/user/file.txt path = os.path.expanduser('~/file.txt') print(path) # 输出: /home/user/file.txt path = os.path.expandvars('$HOME/file.txt') print(path) # 输出: /home/user/file.txt
其他路径信息
- path.getsize(path):获取文件的大小(字节数)。
- path.getmtime(path):获取文件的最后修改时间(时间戳)。
- path.getctime(path):获取文件的创建时间(时间戳)。
- path.getatime(path):获取文件的最后访问时间(时间戳)。
import os print(os.path.getsize('/home/user/file.txt')) # 输出: 文件大小(字节数) print(os.path.getmtime('/home/user/file.txt')) # 输出: 最后修改时间(时间戳) print(os.path.getctime('/home/user/file.txt')) # 输出: 文件创建时间(时间戳) print(os.path.getatime('/home/user/file.txt')) # 输出: 最后访问时间(时间戳)
fileinput:遍历多个输入流
fileinput 模块是 Python 标准库中的一个模块,提供了方便的接口来处理多个文件的输入。它支持逐行读取文件,可以很容易地处理来自多个文件的数据,同时也允许对这些文件进行修改。fileinput 模块的功能特别适合于需要处理文本文件的脚本,例如日志分析、文本处理等。
主要功能
- 处理多个文件:可以从多个文件中读取数据,也可以同时处理这些文件。
- 行处理:逐行读取文件内容,支持对每一行进行处理。
- 文件修改:允许在读取文件的同时对文件进行修改。
- 标准输入支持:可以从标准输入读取数据,适用于管道操作。
使用场景
- 文本处理:逐行读取和处理文件内容,适用于日志分析、文本数据处理等。
- 批处理文件:处理多个文件中的数据,例如批量修改文件内容。
- 标准输入处理:从标准输入读取数据,适用于与其他程序或命令结合使用。
- 脚本自动化:编写自动化脚本处理文件内容,支持文件替换和修改。
fileinput.input() 函数
fileinput.input() 是 fileinput 模块的核心函数,用于打开文件并返回一个可迭代的文件对象。它支持多个文件输入,并可以处理标准输入。
基本用法
- 读取文件:逐行读取指定的文件。
- 支持多个文件:可以传递多个文件名,也可以传递 – 来表示标准输入。
- 支持 in-place 替换:可以在读取的同时对文件进行修改。
示例:读取文件
import fileinput # 从指定的文件读取数据 for line in fileinput.input(files=['file1.txt', 'file2.txt']): print(line, end='')
示例:使用标准输入
import fileinput # 从标准输入读取数据 for line in fileinput.input(): print(line, end='')
fileinput.filename() 函数
fileinput.filename() 返回当前正在处理的文件名。如果从标准输入读取数据,则返回 ‘-‘。
import fileinput for line in fileinput.input(files=['file1.txt', 'file2.txt']): print(f"File: {fileinput.filename()}, Line: {line}", end='')
fileinput.lineno() 函数
fileinput.lineno() 返回当前行的行号(在当前文件中的行号)。
import fileinput for line in fileinput.input(files=['file1.txt', 'file2.txt']): print(f"File: {fileinput.filename()}, Line {fileinput.lineno()}: {line}", end='')
fileinput.filelineno() 函数
fileinput.filelineno() 返回当前行在当前文件中的行号。
import fileinput for line in fileinput.input(files=['file1.txt', 'file2.txt']): print(f"File: {fileinput.filename()}, File Line {fileinput.filelineno()}: {line}", end='')
fileinput.isfirstline() 函数
fileinput.isfirstline() 如果当前行是文件中的第一行,则返回 True,否则返回 False。
import fileinput for line in fileinput.input(files=['file1.txt', 'file2.txt']): if fileinput.isfirstline(): print(f"Start of file: {fileinput.filename()}") print(line, end='')
修改文件内容
fileinput 模块可以通过设置 inplace=True 来实现文件的就地替换。这样可以在读取文件内容的同时对文件进行修改。
示例:文件替换
import fileinput # 在文件中将 'foo' 替换为 'bar' for line in fileinput.input(files=['file1.txt', 'file2.txt'], inplace=True, backup='.bak'): print(line.replace('foo', 'bar'), end='')
- inplace=True:启用就地替换模式,将修改写回到原始文件。
- backup=’suffix’:创建备份文件,suffix 是备份文件的扩展名。
stat:解释 stat 结果
stat 模块是 Python 标准库中的一个模块,用于获取和解释文件系统对象的状态信息。它提供了常量和函数,用于处理 os.stat()、os.lstat() 和 os.fstat() 等系统调用返回的状态信息。这些调用返回一个包含文件或目录状态的对象,stat 模块提供了工具来解析这些信息,特别是文件的权限、类型和其他元数据。
主要功能
- 文件模式常量:定义了一些常量,用于测试和提取文件模式(权限和类型)。
- 文件类型检测:提供了一些函数用于检查文件的类型(如是否为目录、文件、符号链接等)。
- 文件权限解析:提供工具解析文件权限。
- 时间戳:解析文件的创建、访问和修改时间。
使用场景
- 文件权限检查:检测和解析文件的权限,确定文件是否可读、可写或可执行。
- 文件类型检测:判断文件是普通文件、目录、符号链接或其他类型。
- 文件操作自动化:在自动化脚本中使用,以确定如何处理文件和目录。
- 安全检查:在处理文件和目录时,确保只有合适的权限才执行操作。
文件类型常量
这些常量用于从文件模式中提取文件类型信息:
- S_IFMT(mode):返回文件的类型位。
- S_IFDIR:目录。
- S_IFCHR:字符设备。
- S_IFBLK:块设备。
- S_IFREG:普通文件。
- S_IFIFO:FIFO(先进先出队列)。
- S_IFLNK:符号链接。
- S_IFSOCK:套接字。
文件权限常量
这些常量用于提取和解析文件的权限:
- S_ISUID:设置用户 ID 位。
- S_ISGID:设置组 ID 位。
- S_ISVTX:粘滞位(仅对目录有效)。
- S_IRUSR:用户读权限。
- S_IWUSR:用户写权限。
- S_IXUSR:用户执行权限。
- S_IRGRP:组读权限。
- S_IWGRP:组写权限。
- S_IXGRP:组执行权限。
- S_IROTH:其他用户读权限。
- S_IWOTH:其他用户写权限。
- S_IXOTH:其他用户执行权限。
文件类型检测函数
- S_ISDIR(mode):如果模式表示的是目录,则返回 True。
- S_ISCHR(mode):如果模式表示的是字符设备,则返回 True。
- S_ISBLK(mode):如果模式表示的是块设备,则返回 True。
- S_ISREG(mode):如果模式表示的是普通文件,则返回 True。
- S_ISFIFO(mode):如果模式表示的是 FIFO,则返回 True。
- S_ISLNK(mode):如果模式表示的是符号链接,则返回 True。
- S_ISSOCK(mode):如果模式表示的是套接字,则返回 True。
import os import stat # 获取文件状态 file_stat = os.stat('example.txt') # 检查文件类型 if stat.S_ISDIR(file_stat.st_mode): print('This is a directory') elif stat.S_ISREG(file_stat.st_mode): print('This is a regular file')
模式位操作
- S_IMODE(mode):返回权限位(低 9 位)。
- S_IFMT(mode):返回文件类型位(高 4 位)。
import os import stat # 获取文件状态 file_stat = os.stat('example.txt') # 获取文件权限位 permissions = stat.S_IMODE(file_stat.st_mode) print(f'Permissions: {oct(permissions)}') # 输出文件权限,例如 0o644
文件时间戳
通过 os.stat() 等函数返回的 stat_result 对象包含文件的多个时间戳:
- st_atime:最后访问时间。
- st_mtime:最后修改时间。
- st_ctime:元数据或状态更改时间。
这些时间可以通过标准时间模块(如 time 和 datetime)进行格式化和解析。
import os import time # 获取文件状态 file_stat = os.stat('example.txt') # 格式化输出文件的最后修改时间 print('Last modified time:', time.ctime(file_stat.st_mtime))
filecmp:文件和目录的比较
filecmp 模块是 Python 标准库中的一个模块,用于比较文件和目录的内容。它提供了简单易用的接口,可以进行文件、目录的比较操作,并返回比较结果。filecmp 模块适用于需要确定文件是否相同、目录结构是否一致的场景,例如文件备份验证、文件同步工具、目录差异分析等。
主要功能
- 文件比较:比较两个文件的内容是否相同。
- 目录比较:比较两个目录的内容,包括子目录和文件。
- 递归比较:可以递归地比较目录及其子目录的内容。
- 忽略文件:可以指定忽略文件的列表,使其不参与比较。
- 缓存优化:在比较过程中使用缓存,提高性能。
使用场景
- 备份验证:验证备份文件和原始文件是否相同。
- 文件同步:比较两个目录,确定需要同步的文件。
- 目录结构比较:比较两个目录的结构,找出不同之处。
- 文件差异分析:在开发过程中比较文件版本,确定文件的修改情况。
filecmp.cmp() 函数
filecmp.cmp() 函数用于比较两个文件的内容。它通过比较文件的元数据(如大小、最后修改时间等)和内容来确定文件是否相同。
参数:
- f1:第一个文件的路径。
- f2:第二个文件的路径。
- shallow:可选参数,如果为 True(默认值),则只比较文件的元数据;如果为 False,则比较文件的内容。
返回值:
- 返回 True 表示两个文件相同,返回 False 表示不同。
示例:
import filecmp # 比较两个文件 result = filecmp.cmp('file1.txt', 'file2.txt') print(f"Are the files identical? {result}") 深度比较: import filecmp # 进行深度比较(包括文件内容) result = filecmp.cmp('file1.txt', 'file2.txt', shallow=False) print(f"Are the files identical with deep comparison? {result}")
filecmp.cmpfiles() 函数
filecmp.cmpfiles() 函数用于比较两个目录中的指定文件。它返回一个元组,包含三个列表:匹配的文件、不匹配的文件、无法比较的文件。
参数:
- dir1:第一个目录的路径。
- dir2:第二个目录的路径。
- common_files:要比较的文件列表(这些文件在两个目录中都存在)。
- shallow:可选参数,如果为 True(默认值),则只比较文件的元数据;如果为 False,则比较文件的内容。
返回值:
- 一个元组 (match, mismatch, errors):
- match:文件相同的列表。
- mismatch:文件不同的列表。
- errors:无法比较的文件列表(如无法访问等原因)。
示例:
import filecmp # 比较两个目录中的指定文件 match, mismatch, errors = filecmp.cmpfiles('dir1', 'dir2', ['file1.txt', 'file2.txt']) print(f"Matching files: {match}") print(f"Mismatching files: {mismatch}") print(f"Files that could not be compared: {errors}")
filecmp.dircmp 类
filecmp.dircmp 类用于比较两个目录的内容。它不仅比较目录中的文件,还比较目录结构。dircmp 提供了多个属性和方法,用于获取详细的比较结果。
常用属性:
- left_list:第一个目录中的文件列表。
- right_list:第二个目录中的文件列表。
- common:两个目录中共有的文件或目录。
- left_only:只存在于第一个目录中的文件或目录。
- right_only:只存在于第二个目录中的文件或目录。
- common_files:两个目录中内容相同的文件。
- common_dirs:两个目录中共有的子目录。
- diff_files:两个目录中不同的文件。
- funny_files:无法比较的文件。
常用方法:
- report():打印比较结果的摘要。
- report_partial_closure():打印第一级子目录的比较结果。
- report_full_closure():递归打印所有子目录的比较结果。
示例:
import filecmp # 比较两个目录 comparison = filecmp.dircmp('dir1', 'dir2') # 输出比较结果 comparison.report() # 获取详细的比较信息 print(f"Common files: {comparison.common_files}") print(f"Different files: {comparison.diff_files}") print(f"Files only in dir1: {comparison.left_only}") print(f"Files only in dir2: {comparison.right_only}")
tempfile:生成临时文件和目录
tempfile 模块是 Python 标准库中的一个模块,用于创建临时文件和目录。它提供了一些简单易用的函数,能够在处理过程中生成临时的文件或目录,并自动处理它们的清理工作。tempfile 模块在需要临时存储数据的场景中特别有用,例如中间数据的处理、测试文件生成、数据的临时存储等。
主要功能
- 创建临时文件:生成一个临时文件,并返回一个文件对象,可用于读写操作。
- 创建临时目录:生成一个临时目录,并返回该目录的路径。
- 自动清理:在使用完成后,临时文件和目录可以自动删除。
- 安全性:保证创建的临时文件和目录具有唯一性,避免命名冲突。
使用场景
- 临时数据存储:在处理过程中存储临时数据,防止数据污染。
- 测试:生成临时文件或目录用于测试,测试完成后自动清理。
- 中间文件处理:在处理流程中生成中间文件,流程结束后自动清理。
- 安全文件操作:生成独立的临时文件,避免文件名冲突和安全问题。
tempfile.TemporaryFile() 函数
tempfile.TemporaryFile() 创建并打开一个临时文件,该文件在关闭时会自动删除。返回的文件对象支持常规的文件操作(读、写、查找等)。
参数:
- mode:文件的打开模式(默认 ‘w+b’,即二进制读写模式)。
- buffering:文件的缓冲策略。
- encoding:文本模式下使用的编码。
- newline:控制文本模式下的行结尾。
- suffix:文件名的后缀。
- prefix:文件名的前缀。
- dir:临时文件所在的目录。
返回值:
- 返回一个可读写的文件对象。
示例:
import tempfile # 创建一个临时文件 with tempfile.TemporaryFile() as temp_file: temp_file.write(b'This is some temporary data') temp_file.seek(0) print(temp_file.read()) # 读取数据
tempfile.NamedTemporaryFile() 函数
tempfile.NamedTemporaryFile() 与 TemporaryFile() 类似,但它返回的文件对象有一个 name 属性,表示临时文件的路径。该文件在关闭时也会自动删除。
参数:
- 参数与 TemporaryFile() 类似。
返回值:
- 返回一个带有 name 属性的文件对象。
示例:
import tempfile # 创建一个带有文件名的临时文件 with tempfile.NamedTemporaryFile() as temp_file: print(f'Temporary file created: {temp_file.name}') temp_file.write(b'Temporary data') temp_file.seek(0) print(temp_file.read())
tempfile.TemporaryDirectory() 类
tempfile.TemporaryDirectory() 创建一个临时目录,目录路径由系统自动生成。目录及其内容在关闭时会自动删除。
参数:
- suffix:目录名的后缀。
- prefix:目录名的前缀。
- dir:临时目录所在的目录。
返回值:
- 返回一个表示临时目录的对象。
示例:
import tempfile # 创建一个临时目录 with tempfile.TemporaryDirectory() as temp_dir: print(f'Temporary directory created: {temp_dir}') # 在临时目录中创建文件或其他内容 file_path = f'{temp_dir}/temp_file.txt' with open(file_path, 'w') as temp_file: temp_file.write('Temporary content') # 临时目录及其内容在此处被删除
tempfile.mkstemp() 函数
tempfile.mkstemp() 创建一个低级别的临时文件并返回一个元组 (file_descriptor, path)。文件描述符可以用于低级别的文件操作。
参数:
- 参数与 TemporaryFile() 类似。
返回值:
- 返回一个包含文件描述符和文件路径的元组。
示例:
import os import tempfile # 创建一个临时文件,并获取其文件描述符和路径 fd, path = tempfile.mkstemp() print(f'Temporary file created at: {path}') os.write(fd, b'Some data') os.close(fd)
tempfile.mkdtemp() 函数
tempfile.mkdtemp() 创建一个临时目录并返回其路径。该目录不会自动删除,需要手动清理。
参数:
- 参数与 TemporaryDirectory() 类似。
返回值:
- 返回临时目录的路径。
示例:
import tempfile # 创建一个临时目录 temp_dir = tempfile.mkdtemp() print(f'Temporary directory created: {temp_dir}') # 使用完毕后,手动删除目录 import shutil shutil.rmtree(temp_dir)
glob:Unix 风格路径名模式扩展
glob 模块是 Python 标准库中的一个模块,用于在文件系统中查找符合特定模式的文件路径。它基于 Unix 风格的路径模式匹配规则,通过简单的通配符搜索来找到文件和目录。glob 模块特别适合在需要批量处理文件时使用,例如批量读取文件、文件筛选和批量重命名等任务。
主要功能
- 路径匹配:使用通配符(如 *, ?, [] 等)匹配文件路径。
- 递归搜索:支持在目录及其子目录中递归查找匹配的文件。
- 文件筛选:可以快速筛选出符合特定模式的文件和目录。
使用场景
- 文件批量处理:在特定目录中批量处理符合条件的文件,如批量读取、修改或删除文件。
- 文件筛选:筛选出符合特定模式的文件,方便进行后续操作。
- 递归文件查找:在目录及其子目录中递归查找特定类型的文件,如查找所有日志文件、图片文件等。
- 自动化脚本:在自动化脚本中使用 glob,可以根据文件模式执行批量操作,提高工作效率。
示例
批量重命名文件
import glob import os # 批量重命名当前目录下的所有 .txt 文件 for file_name in glob.glob('*.txt'): new_name = 'prefix_' + file_name os.rename(file_name, new_name)
递归查找所有图像文件
import glob # 递归查找当前目录及子目录中的所有 .jpg 和 .png 文件 image_files = glob.glob('**/*.[jp][pn]g', recursive=True) print(image_files)
筛选特定格式的日志文件
import glob # 筛选出所有以 '2023' 开头的日志文件 log_files = glob.glob('2023*.log') print(log_files)
通配符
在使用 glob 模块时,主要使用以下通配符进行路径匹配:
- *:匹配任意数量的字符(包括零个字符),但不包括路径分隔符 /。例如,*.txt 匹配当前目录中的所有 .txt 文件。
- ?:匹配任意单个字符,但不包括路径分隔符 /。例如,file?.txt 匹配txt、fileA.txt,但不匹配 file10.txt。
- []:匹配括号内的任意字符(可以是字符范围)。例如,file[0-9].txt 匹配txt 到 file9.txt,但不匹配 file10.txt。
glob.glob() 函数
glob.glob() 是 glob 模块的核心函数,用于查找与指定模式匹配的文件路径。默认情况下,它只在当前目录中查找。
参数:
- pathname:路径模式字符串,可以包含通配符。
- recursive:可选参数,如果为 True,则递归搜索子目录。
返回值:
- 返回一个匹配路径的列表。
示例:
import glob # 查找当前目录下的所有 .txt 文件 txt_files = glob.glob('*.txt') print(txt_files) # 查找当前目录及其子目录下的所有 .txt 文件 all_txt_files = glob.glob('**/*.txt', recursive=True) print(all_txt_files)
glob.iglob() 函数
glob.iglob() 与 glob.glob() 类似,但返回的是一个迭代器,而不是一个列表。这在处理大量文件时更加高效,因为它不需要一次性将所有匹配结果加载到内存中。
参数:
- 与glob() 相同。
返回值:
- 返回一个迭代器,逐个生成匹配的路径。
示例:
import glob # 使用迭代器逐个获取 .txt 文件路径 for txt_file in glob.iglob('*.txt'): print(txt_file)
fnmatch:Unix shell 风格的文件名匹配
fnmatch 模块是 Python 标准库中的一个模块,用于匹配文件名或字符串,类似于 Unix shell 中的通配符匹配。fnmatch 模块提供了一些函数,可以用来测试一个字符串是否符合指定的模式,或将特定模式应用于多个字符串以进行过滤。
主要功能
fnmatch 模块的主要功能包括:
- 字符串匹配:根据通配符模式匹配字符串。
- 模式过滤:筛选出符合指定模式的字符串列表。
- 跨平台支持:fnmatch 的匹配方式适用于所有平台,而不仅仅是 Unix 系统。
使用场景
- 文件名匹配:根据文件名模式来匹配文件,例如在文件管理工具中筛选特定类型的文件。
- 批量处理:处理符合特定命名规则的文件或数据,如批量重命名、批量删除等。
- 跨平台文件操作:由于 fnmatch 支持所有操作系统,因此在编写跨平台脚本时,可以使用 fnmatch 进行可靠的文件名匹配。
- 字符串过滤:过滤列表中的字符串,例如根据模式筛选日志文件名或URL列表。
示例
批量重命名文件
import fnmatch import os # 获取当前目录下的所有文件 files = os.listdir('.') # 筛选出所有 .txt 文件 txt_files = fnmatch.filter(files, '*.txt') # 批量重命名 for file_name in txt_files: new_name = 'new_' + file_name os.rename(file_name, new_name)
字符串列表的高级过滤
import fnmatch # 给定 URL 列表 urls = [ 'https://example.com/file1.html', 'https://example.com/file2.jpg', 'https://example.com/index.html', 'https://example.com/image.png', ] # 筛选出所有 HTML 文件 html_files = fnmatch.filter(urls, '*.html') print(html_files) # ['https://example.com/file1.html', 'https://example.com/index.html']
通配符
fnmatch 模块使用的通配符与 glob 模块类似:
- *:匹配任意数量的字符(包括零个字符),但不包括路径分隔符 /。
- ?:匹配任意单个字符,但不包括路径分隔符 /。
- []:匹配括号内的任意字符。例如,[abc] 匹配 a、b 或 c。
fnmatch.fnmatch() 函数
fnmatch.fnmatch() 函数用于测试单个字符串是否匹配指定的模式。这个函数区分大小写的程度取决于操作系统:在 Windows 和 macOS 上不区分大小写,而在 Unix 系统上区分大小写。
参数:
- filename:要匹配的字符串。
- pattern:通配符模式。
返回值:
- 如果字符串匹配模式,返回 True;否则返回 False。
示例:
import fnmatch # 匹配字符串 print(fnmatch.fnmatch('file.txt', '*.txt')) # True print(fnmatch.fnmatch('file.TXT', '*.txt')) # 取决于操作系统 print(fnmatch.fnmatch('file1.txt', 'file?.txt')) # True print(fnmatch.fnmatch('file10.txt', 'file?.txt')) # False
fnmatch.fnmatchcase() 函数
fnmatch.fnmatchcase() 类似于 fnmatch.fnmatch(),但它始终区分大小写,无论操作系统如何。
参数:
- filename:要匹配的字符串。
- pattern:通配符模式。
返回值:
- 如果字符串匹配模式,返回 True;否则返回 False。
示例:
import fnmatch # 区分大小写的匹配 print(fnmatch.fnmatchcase('file.txt', '*.TXT')) # False print(fnmatch.fnmatchcase('file.TXT', '*.TXT')) # True
fnmatch.filter() 函数
fnmatch.filter() 函数用于筛选一个字符串列表,只返回符合指定模式的字符串。
参数:
- names:字符串列表。
- pattern:通配符模式。
返回值:
- 返回一个包含匹配字符串的列表。
示例:
import fnmatch # 筛选符合模式的字符串 names = ['file1.txt', 'file2.txt', 'file3.doc', 'notes.txt'] filtered_names = fnmatch.filter(names, '*.txt') print(filtered_names) # ['file1.txt', 'file2.txt', 'notes.txt']
nmatch.translate() 函数
fnmatch.translate() 函数将通配符模式转换为正则表达式模式。这个函数的输出通常用于更高级的字符串匹配需求,例如当需要在正则表达式上下文中使用时。
参数:
- pattern:通配符模式。
返回值:
- 返回一个对应的正则表达式字符串。
示例:
import fnmatch import re # 将通配符模式转换为正则表达式 regex_pattern = fnmatch.translate('*.txt') print(regex_pattern) # '.*\\.txt\\Z(?ms)' # 使用正则表达式进行匹配 matched = re.match(regex_pattern, 'file.txt') print(bool(matched)) # True
linecache:随机行缓存
linecache 模块是 Python 标准库中的一个模块,专门用于从文件中高效地读取特定行。这个模块的主要优势在于它会将读取的文件内容缓存起来,避免多次读取同一个文件的相同内容,特别是在处理需要频繁访问特定行的大型文件时非常有用。
主要功能
linecache 模块的主要功能包括:
- 从文件中读取特定行:快速获取文件的特定行内容,而不必手动遍历文件。
- 缓存机制:读取过的文件内容会被缓存,后续访问相同内容时速度更快。
- 错误处理:处理文件不存在或读取失败的情况,返回空字符串而不是抛出异常。
使用场景
linecache 模块特别适合以下场景:
- 调试:在调试过程中,尤其是处理异常时,可以快速获取出错代码所在行的内容。
- 日志分析:在分析大型日志文件时,可以通过 linecache 模块高效地提取特定行的数据。
- 代码执行追踪:在分析 Python 代码执行路径或回溯堆栈时,linecache 可以用来快速获取源代码的某一行内容。
示例
从文件中读取特定行
import linecache # 读取文件的第 5 行 line = linecache.getline('example.txt', 5) print(f'The 5th line is: {line}')
读取和处理多行数据
import linecache # 读取文件的前 10 行并处理 for i in range(1, 11): line = linecache.getline('example.txt', i) print(f'Line {i}: {line}')
使用缓存读取大型文件
import linecache # 读取大型文件的指定行,利用缓存提高访问效率 line1 = linecache.getline('largefile.txt', 100) line2 = linecache.getline('largefile.txt', 200) # 再次访问相同的行,直接从缓存中获取 line3 = linecache.getline('largefile.txt', 100)
缺点和注意事项
- 缓存的使用:虽然缓存提高了读取速度,但在文件频繁变化的情况下,缓存可能会导致数据过期或不准确。因此,在文件可能更新的情况下,使用checkcache() 确保缓存数据的有效性。
- 内存消耗:由于缓存机制,频繁访问不同文件的大量行可能导致较高的内存使用。因此,在处理非常大的文件集时,可能需要手动清理缓存。
linecache.getline() 函数
linecache.getline() 是 linecache 模块的核心函数,用于从文件中读取特定行。如果读取的行已经在缓存中,则直接从缓存中返回。
参数:
- filename:文件路径。
- lineno:要读取的行号(从 1 开始)。
- module_globals:可选参数,通常用于模块内部的全局变量。
返回值:
- 返回文件中指定行的内容。如果行号无效(如行号超出文件总行数),返回空字符串。
示例:
import linecache # 假设有一个名为 'example.txt' 的文件 line = linecache.getline('example.txt', 3) print(line) # 输出文件的第三行内容
inecache.getlines() 函数
linecache.getlines() 用于读取文件的所有行,并返回一个列表,每个元素是文件的一行。此函数也会将文件内容缓存起来,以提高后续访问速度。
参数:
- filename:文件路径。
返回值:
- 返回一个包含文件所有行的列表。
示例:
import linecache # 读取文件的所有行 lines = linecache.getlines('example.txt') print(lines) # 输出文件的所有行
linecache.clearcache() 函数
linecache.clearcache() 用于清除 linecache 模块的内部缓存。这在需要释放内存或确保缓存数据不再使用时非常有用。
参数:无。
返回值:无。
示例:
import linecache # 清除缓存 linecache.clearcache()
linecache.checkcache() 函数
linecache.checkcache() 用于检查缓存中的文件是否仍然有效。如果缓存中的文件发生了修改,这个函数会自动更新缓存或将其删除。
参数:
- filename:可选参数,指定要检查的文件名。如果不提供此参数,则检查所有缓存的文件。
返回值:无。
示例:
import linecache # 检查并更新缓存 linecache.checkcache('example.txt')
shutil:高级文件操作
shutil 是 Python 标准库中的一个模块,专门用于高层次的文件操作。它提供了多种用于复制、移动、删除和归档文件和目录的函数,极大地简化了文件系统的操作。与 os 模块提供的低层次文件操作不同,shutil 主要关注的是更高级别、更常用的操作。
主要功能
- 复制文件和目录:包括复制文件内容、权限、时间戳等信息。
- 移动文件和目录:将文件或目录从一个位置移动到另一个位置。
- 删除文件和目录:递归地删除整个目录树。
- 创建归档:支持创建和解压缩多种格式的归档文件(如 zip、tar)。
- 磁盘使用情况查询:获取文件系统的磁盘使用情况。
使用场景
- 文件备份:使用copy() 或 shutil.copytree() 来备份重要文件或目录。
- 文件系统管理:通过move() 和 shutil.rmtree() 实现文件和目录的重组和清理。
- 自动化脚本:在自动化任务中,比如打包、归档、发布等,使用make_archive() 进行文件打包。
- 磁盘监控:通过disk_usage() 监控磁盘空间使用情况,防止磁盘空间不足。
使用示例
自动化备份脚本
import shutil import os # 定义源目录和目标备份目录 src_dir = 'important_data/' backup_dir = 'backup/' # 递归复制源目录到备份目录 if not os.path.exists(backup_dir): os.makedirs(backup_dir) shutil.copytree(src_dir, backup_dir + 'data_backup')
磁盘空间检查
import shutil # 获取磁盘使用情况 usage = shutil.disk_usage('/') print(f'Total: {usage.total / (1024 ** 3):.2f} GB') print(f'Used: {usage.used / (1024 ** 3):.2f} GB') print(f'Free: {usage.free / (1024 ** 3):.2f} GB') # 如果可用空间不足 10GB,发出警告 if usage.free / (1024 ** 3) < 10: print('Warning: Low disk space!')
shutil.copy() 函数
shutil.copy() 用于复制文件。它会将源文件的内容复制到目标文件中,但不会复制文件的元数据(如权限和时间戳)。
参数:
- src:源文件路径。
- dst:目标文件路径或目标目录路径。
返回值:
- 返回目标文件的路径。
示例:
import shutil # 将 'source.txt' 文件复制到 'destination.txt' shutil.copy('source.txt', 'destination.txt')
shutil.copy2() 函数
shutil.copy2() 与 shutil.copy() 类似,但它除了复制文件内容外,还会复制文件的元数据(如时间戳和权限)。
参数:
- 与copy() 相同。
返回值:
- 返回目标文件的路径。
示例:
import shutil # 将 'source.txt' 文件复制到 'destination.txt',包括元数据 shutil.copy2('source.txt', 'destination.txt')
shutil.copytree() 函数
shutil.copytree() 用于递归地复制整个目录树。它会将源目录及其所有内容复制到目标目录中。
参数:
- src:源目录路径。
- dst:目标目录路径。
- symlinks:可选参数,如果为 True,则复制符号链接而不复制其目标内容。
- ignore:可选参数,可以指定一个函数来忽略某些文件或目录。
返回值:
- 返回目标目录的路径。
示例:
import shutil # 递归复制 'src_folder' 目录及其内容到 'dst_folder' shutil.copytree('src_folder', 'dst_folder')
shutil.move() 函数
shutil.move() 用于移动文件或目录。如果目标位置存在相同名称的文件或目录,可能会被覆盖。
参数:
- src:源路径(文件或目录)。
- dst:目标路径(文件或目录)。
返回值:
- 返回目标路径。
示例:
import shutil # 将文件或目录 'example.txt' 移动到 'new_location/' shutil.move('example.txt', 'new_location/')
shutil.rmtree() 函数
shutil.rmtree() 用于递归地删除整个目录树。它会删除指定目录及其所有内容,包括子目录和文件。
参数:
- path:要删除的目录路径。
- ignore_errors:可选参数,如果为 True,则忽略删除时的错误。
- onerror:可选参数,指定在删除出错时的处理函数。
返回值:
- 无。
示例:
import shutil # 递归删除 'old_folder' 目录及其所有内容 shutil.rmtree('old_folder')
shutil.make_archive() 函数
shutil.make_archive() 用于创建归档文件。它支持多种格式,如 zip、tar、gztar 等。
参数:
- base_name:归档文件的基础名称,不包括扩展名。
- format:归档格式,如 zip、tar 等。
- root_dir:可选参数,指定要归档的根目录。
- base_dir:可选参数,指定要归档的根目录中的子目录。
返回值:
- 返回创建的归档文件路径。
示例:
import shutil # 创建一个 ZIP 格式的归档文件 'archive.zip',包含 'src_folder' 目录 shutil.make_archive('archive', 'zip', 'src_folder')
shutil.disk_usage() 函数
shutil.disk_usage() 用于查询给定路径所在文件系统的磁盘使用情况。
参数:
- path:路径,可以是任何文件或目录路径。
返回值:
- 返回一个命名元组,包含总大小、已用空间和可用空间(单位为字节)。
示例:
import shutil # 查询磁盘使用情况 usage = shutil.disk_usage('/') print(f'Total: {usage.total} bytes') print(f'Used: {usage.used} bytes') print(f'Free: {usage.free} bytes')
参考链接: