器→工具, 编程语言

Python标准库之文件和目录访问

钱魏Way · · 51 次浏览

在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')

参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注