【实用 Python 库】Python glob库:轻松应对文件和目录管理

2023-07-25 01:38:30

导言

在Python编程中,我们经常需要处理文件和目录。为了更便捷地处理这些任务,Python提供了glob库,它允许我们根据特定模式匹配文件和目录。本篇博客将详细介绍glob库的用法,并通过实例演示它的各种功能。

什么是glob库?

glob库是Python标准库中的一个模块,它提供了一个简单而强大的方法来匹配文件和目录的路径名。通常情况下,我们在命令行中使用通配符来搜索文件,例如*.txt表示匹配所有以.txt为后缀的文件。glob库允许我们以编程的方式在Python脚本中执行类似的文件匹配操作。

glob库的主要方法是glob()函数,该函数接受一个模式字符串作为输入,并返回与该模式匹配的所有文件和目录的列表。

安装glob

在大多数情况下,Python已经预装了glob库,因此你不需要额外安装。如果你的Python环境中没有glob库,可以使用以下命令来安装:

pip install glob2

现在让我们开始探索glob库的各种功能。

基本使用方法

导入glob

在使用glob库之前,首先需要导入它。在Python中,我们使用import语句来导入模块:

import glob

使用通配符匹配文件

glob库使用通配符来匹配文件和目录。下面是一些常用的通配符:

  • *:匹配0个或多个字符。
  • ?:匹配单个字符。
  • []:匹配指定范围内的字符,如[0-9]匹配所有数字字符。

让我们来看一个例子。假设我们有一个文件夹data,其中包含以下文件:

data/
    file1.txt
    file2.txt
    image.jpg
    data.csv

现在,我们想要匹配所有以.txt为后缀的文件。我们可以使用*.txt作为模式字符串:

txt_files = glob.glob("data/*.txt")
print(txt_files)

输出:

['data/file1.txt', 'data/file2.txt']

正如我们所见,glob.glob()函数返回了一个列表,其中包含了所有以.txt为后缀的文件路径。

匹配特定目录

如果我们希望匹配的文件在子目录中,我们可以使用双星号**来进行递归搜索。例如,假设我们有以下文件结构:

data/
    file1.txt
    subdir/
        file2.txt
        file3.txt

我们想要匹配所有以.txt为后缀的文件,不论它们位于哪个子目录中。我们可以使用**/*.txt作为模式字符串:

txt_files_recursive = glob.glob("data/**/*.txt", recursive=True)
print(txt_files_recursive)

输出:

['data/file1.txt', 'data/subdir/file2.txt', 'data/subdir/file3.txt']

使用recursive=True参数,我们可以匹配到所有子目录中的文件。

匹配多种后缀

有时候我们需要匹配多种后缀的文件,可以使用[]来指定匹配的范围。例如,如果我们想要匹配.txt.csv文件,我们可以使用["*.txt", "*.csv"]作为模式字符串:

txt_and_csv_files = glob.glob("data/*.[txt|csv]")
print(txt_and_csv_files)

输出:

['data/file1.txt', 'data/file2.txt', 'data/data.csv']

获取目录列表

除了匹配文件,glob库还可以获取目录列表。如果我们想要列出所有子目录,可以使用*/作为模式字符串:

subdirs = glob.glob("data/*/") 
print(subdirs)

输出:

['data/subdir/']

使用iglob()进行迭代

对于大型目录,一次性获取所有匹配的文件列表可能会占用大量内存。在这种情况下,可以使用iglob()函数来进行迭代获取。iglob()返回一个迭代器,逐个返回匹配的文件名。

txt_files_iterator = glob.iglob("data/*.txt")
for file in txt_files_iterator:
    print(file)

输出:

data/file1.txt
data/file2.txt

iglob()适用于处理大量文件时,可以节省内存开销。

过滤和排序匹配结果

在上面的例子中,我们看到glob.glob()返回匹配模式的所有文件和目录列表。然而,有时候我们可能只对某些特定的文件感兴趣,或者希望按照一定规则对匹配结果进行排序。glob库提供了一些方法来实现这些需求。

过滤匹配结果

glob库允许我们使用fnmatch模块的匹配方法来过滤匹配结果。这对于在匹配结果中执行更复杂的模式匹配非常有用。例如,假设我们只想匹配以file开头的文件:

import glob
import fnmatch

# 获取所有以'file'开头的文件
file_starting_with_file = fnmatch.filter(glob.glob("data/*"), "file*")
print(file_starting_with_file)

输出:

['data/file1.txt', 'data/file2.txt']

在这个例子中,我们使用fnmatch.filter()方法来从匹配结果中过滤以file开头的文件。

排序匹配结果

glob库返回的匹配结果通常是按照操作系统的文件系统规则排序的。但是,有时候我们可能需要按照自定义的方式对匹配结果进行排序。在这种情况下,我们可以使用Python的内置sorted()函数来对匹配结果进行排序。

例如,假设我们想按照文件大小对匹配的文件进行排序:

import glob
import os

# 获取匹配的文件并按照文件大小排序
matched_files = glob.glob("data/*.txt")
sorted_files_by_size = sorted(matched_files, key=os.path.getsize)
print(sorted_files_by_size)

输出:

['data/file1.txt', 'data/file2.txt']

在这个例子中,我们使用os.path.getsize()函数作为sorted()函数的key参数,从而按照文件大小对匹配结果进行排序。

自定义匹配规则

glob库允许我们使用自定义函数来对匹配结果进行过滤和排序。例如,假设我们想要匹配所有以奇数数字结尾的文件,并按照数字大小进行排序:

import glob

# 自定义过滤函数
def custom_filter(file_path):
    filename = file_path.split("/")[-1]
    last_char = filename[-5]  # 获取倒数第5个字符,即文件名中的最后一个数字
    return last_char.isdigit() and int(last_char) % 2 == 1

# 获取匹配的文件并按照自定义规则排序
matched_files = glob.glob("data/*")
filtered_and_sorted_files = sorted(filter(custom_filter, matched_files))
print(filtered_and_sorted_files)

输出:

['data/file1.txt']

在这个例子中,我们定义了一个custom_filter()函数来过滤以奇数数字结尾的文件,并使用sorted()函数按照自定义规则进行排序。

遍历子目录中的文件

前面我们介绍了使用**来进行递归搜索,但如果你只希望遍历子目录中的文件而不进一步进入子目录,可以使用glob.glob()结合os.path.join()来实现。

例如,假设我们有以下文件结构:

data/
    file1.txt
    subdir1/
        file2.txt
        file3.txt
    subdir2/
        file4.txt

现在我们只想遍历data目录及其直接子目录中的所有文件:

import glob
import os

def list_files_in_directory(directory):
    files = []
    for file_path in glob.glob(os.path.join(directory, "*")):
        if os.path.isfile(file_path):
            files.append(file_path)
    return files

directory_path = "data"
files_in_directory = list_files_in_directory(directory_path)
print(files_in_directory)

输出:

['data/file1.txt', 'data/subdir1/file2.txt', 'data/subdir1/file3.txt', 'data/subdir2/file4.txt']

在这个例子中,我们定义了一个list_files_in_directory()函数,该函数遍历指定目录中的文件,并忽略子目录。使用os.path.join()函数来构建文件路径,确保可以正确处理不同操作系统下的路径分隔符。

使用glob库进行文件处理

glob库不仅仅用于匹配和获取文件列表,还可以方便地进行文件处理。我们可以将glob库与其他Python库(例如osshutil等)结合使用,来执行各种文件操作。

复制文件

假设我们想将所有以.txt为后缀的文件复制到另一个目录中,我们可以使用shutil库来实现:

import glob
import shutil

source_directory = "data"
destination_directory = "backup"

txt_files = glob.glob(os.path.join(source_directory, "*.txt"))
for txt_file in txt_files:
    shutil.copy(txt_file, destination_directory)

在这个例子中,我们首先使用glob库来获取所有以.txt为后缀的文件列表,然后使用shutil.copy()函数将这些文件复制到backup目录中。

删除文件

如果我们希望删除所有以.csv为后缀的文件,可以使用os.remove()函数来实现:

import glob

csv_files = glob.glob("data/*.csv")
for csv_file in csv_files:
    os.remove(csv_file)

在这个例子中,我们使用glob库来获取所有以.csv为后缀的文件列表,然后使用os.remove()函数来删除这些文件。

批量重命名文件

glob库与字符串处理和os.rename()函数结合使用,可以批量重命名文件。假设我们有一系列文件名格式为file_<num>.txt(例如file_1.txtfile_2.txt等),现在我们希望将它们重命名为data_<num>.txt

import glob
import os

files_to_rename = glob.glob("data/file_*.txt")
for old_file_path in files_to_rename:
    new_file_path = old_file_path.replace("file_", "data_")
    os.rename(old_file_path, new_file_path)

在这个例子中,我们首先使用glob库获取所有需要重命名的文件,然后使用字符串的replace()方法将file_替换为data_,最后使用os.rename()函数进行重命名。

使用glob库的注意事项

虽然glob库是一个功能强大的工具,但在使用时还有一些注意事项:

  • 在使用glob库时,应该谨慎处理用户提供的输入,以避免路径遍历攻击(Path Traversal Attack)。
  • 使用glob库时要注意平台兼容性,特别是在处理路径分隔符时。建议使用os.path.join()来构建文件路径,以确保在不同操作系统上都能正确运行。
  • 对于大型目录和大量文件的处理,使用iglob()或者配合生成器(generator)等方法,可以避免不必要的内存开销。

结语

glob库提供了一个简单而强大的方法来管理文件和目录,让我们可以轻松地在Python脚本中处理文件。通过掌握glob库的使用,我们可以更高效地编写Python程序,并在实际项目中应用它们。

希望本篇博客能帮助你理解和学会使用glob库,让你在文件处理和目录管理中能够游刃有余。继续探索和实践,你将在Python编程中收获更多的乐趣和成就!

更多推荐

爬虫异常处理技巧分享

在进行爬虫数据采集的过程中,我们常常会遇到网络波动和自动化验证等异常情况。这些问题可能导致爬虫运行中断或被识别为机器请求而受到限制。本文将分享一些实用的爬虫异常处理技巧,帮助您规避网络波动和自动化验证,提高数据采集的稳定性和成功率。一、处理网络波动1.设置重试机制:当爬取过程中遇到网络错误或超时,在合理的时间范围内进行

爬虫入门基础-Selenium反爬

在网络时代,爬虫作为一种强大的数据采集工具,被广泛应用于各行各业。然而,许多网站为了防止被恶意爬取数据,采取了各种反爬虫机制。为了能够成功地绕过这些机制,Selenium成为了爬虫领域的一把利器。本文将为你介绍爬虫入门基础,并重点探讨如何使用Selenium应对反爬虫的挑战。一、爬虫入门基础1、定义:爬虫是一种模拟浏览

minikube搭建k8s

环境:centos7,docker18minikube搭建k8s说明minikube是最接近原生kubernetes的本地单机版集群,支持大部分kubernetes功能,用于学习和开发k8s。支持Linux、Windows、Mac官网安装文档安装前提一台物理机或者虚拟机,物理机CPU大于2核vcpu、2G内存、20G磁

Java堆(Java Heap)

对于Java应用程序来说,Java堆(JavaHeap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。在《Java虚拟机规范》中对Java堆的描述是:“所有的对象实例以及数组都应

ZMQ协议

一、ZMQ特点普通的socket是端对端的关系,ZMQ是N:M的关系,socket的连接需要显式地建立连接,销毁连接,选择协议(TCP/UDP)和错误处理,ZMQ屏蔽了这些细节,像是一个封装了的socket库,让网络编程变得更简单。ZMQ不光用于主机与主机之间的socket通信,还可以是线程和进程之间的通信。ZMQ提供

Zookeeper集群 + Kafka集群

ZookeeperZookeeper概述Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目Zookeeper工作机制Zookeeper从设计模式角度来理解:是一个,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zo

Vue路由与nodes的环境配置

一,Vue路由什么是Vue路由?Vue路由是Vue.js的一部分,是一个官方的Vue.js插件,用于管理单页面应用程序的路由。它允许您在应用程序中使用URL路径和参数来管理不同的页面视图,而无需刷新页面。使用Vue路由,您可以轻松地设置和管理客户端路由,包括嵌套和动态路由。它还提供了一些高级功能,例如路由守卫,用于在页

leetcode646. 最长数对链(java)

最长数对链题目描述贪心解法二动态规划dp题目描述难度-中等leetcode646.最长数对链(java)给你一个由n个数对组成的数对数组pairs,其中pairs[i]=[lefti,righti]且lefti<righti。现在,我们定义一种跟随关系,当且仅当b<c时,数对p2=[c,d]才可以跟在p1=[a,b]后

HTML 学习笔记(基础)

它是超文本标记语言,由一大堆约定俗成的标签组成,而其标签里一般又有一些属性值可以设置。W3C标准:网页主要三大部分结构:HTML表现:CSS行为:JavaScript<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewpor

配置 iSCSI 服务并实现客户端自动挂载块设备

文章目录前言1.iSCSI简介2.iSCSIServer端配置2.1.添加磁盘2.2.安装targetcli软件包2.3.创建块设备2.4.创建Target2.5.创建LUN2.6.创建ACL2.7.配置门户创建监听2.8.查看全部配置信息并保存退出2.9.启用Target服务3.iSCSIClient端配置3.1.安

C# 扫描并读取图片中的文字(.NET Core)

本文介绍如何通过C#程序来扫描并读取图片中的文字,这里以创建一个.NetCore程序为例。下面是具体步骤,供参考。程序测试环境:VisualStudio版本要求不低于2017图片扫描工具:Spire.OCRfor.NET图片格式:png(这里的图片格式支持JPG、PNG、GIF、BMP、TIFF等格式)扫描的图片文字:

热文推荐