本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在IT领域,文件和目录操作是基础技能之一。本文以Python语言为例,详细介绍了如何使用 os glob 模块获取指定目录下的文件路径和文件名,统计文件数量,以及递归地处理子目录。掌握这些技能对于文件管理、数据处理和自动化脚本编写等任务至关重要。 获取指定目录下的文件路径及文件名

1. 文件和目录操作基础

在计算机世界中,文件系统是构建信息存储和检索的基石。掌握基础的文件和目录操作是任何软件开发者必备的技能。文件和目录的操作涉及创建、读取、写入、删除以及路径管理等任务,对于提升程序的效率和用户体验至关重要。本章将介绍文件和目录操作的基本概念,为后续章节中利用Python进行高级操作打下坚实的基础。我们将从最基础的文件和目录的理解开始,逐步深入到如何使用Python进行这些操作。内容将从简单的文件存在性检查、文件创建和删除,扩展到目录的遍历、文件的重命名等。通过这些操作,读者将能够理解文件系统的基础结构,并能够通过Python脚本对文件和目录进行管理。

2. Python os模块应用

2.1 os模块概述

2.1.1 os模块的功能与作用

os模块是Python标准库的一部分,它提供了一种使用操作系统功能的方式。通过os模块,Python脚本可以执行文件操作、目录管理、进程管理等系统级任务。它让Python脚本与操作系统之间的交互变得简单直接,无需调用系统命令或外部库。

2.1.2 os模块与其他模块的关系

虽然os模块是Python标准库的一部分,但在进行高级系统编程任务时,它通常会与其他模块一起使用,例如 shutil 模块用于更高级的文件操作和目录管理, subprocess 模块用于执行系统命令。os模块提供的是基础的操作系统接口,其他模块则在此基础上提供更为复杂和专门的功能。

2.2 os模块中的文件和目录操作函数

2.2.1 获取当前工作目录:os.getcwd()

os.getcwd() 函数用于获取当前工作目录的绝对路径。这个功能非常实用,尤其是在需要操作当前工作目录下的文件时。

import os

# 获取当前工作目录并打印
current_dir = os.getcwd()
print("当前工作目录是:", current_dir)

这个函数非常简单,只需要导入os模块并调用 getcwd() 即可。它不接受任何参数,返回当前工作目录的字符串路径。

2.2.2 改变当前工作目录:os.chdir()

os.chdir(path) 函数用于改变当前工作目录到指定的路径。在进行文件操作前,有时候我们需要切换到特定的目录下,这时 os.chdir() 就非常有用。

# 改变当前工作目录到指定路径
try:
    os.chdir("/path/to/directory")
    print("目录已成功改变到:", os.getcwd())
except OSError as error:
    print("目录改变失败:", error)

使用 os.chdir() 时,如果路径不存在或不可访问,会抛出 OSError 异常,因此在实际应用中需要使用异常处理来确保代码的健壮性。

2.2.3 创建和删除目录:os.mkdir()与os.rmdir()

os.mkdir(path, mode=0o777) 函数用于创建一个名为path的目录,而 os.rmdir(path) 用于删除指定的目录。

# 创建新目录
try:
    os.mkdir("new_directory")
    print("目录创建成功")
except OSError as error:
    print("目录创建失败:", error)

# 删除目录
try:
    os.rmdir("new_directory")
    print("目录删除成功")
except OSError as error:
    print("目录删除失败:", error)

os.mkdir() 允许我们设置目录的权限模式,而 os.rmdir() 只能删除空目录,如果目录非空则会抛出 OSError 异常。

本章小结

在本章节中,我们介绍了Python中os模块的基础应用,包括获取和改变当前工作目录、创建和删除目录等操作。通过这些基础操作,我们可以进行更复杂的文件和目录管理任务,为后续章节中更高级的文件操作打下坚实的基础。

3. os.listdir()函数使用

3.1 os.listdir()函数简介

3.1.1 函数功能描述

os.listdir() 函数用于列出指定目录下的所有文件和目录名。返回的列表中只包含文件名和目录名,并不包括路径本身。这个函数在处理文件和目录列表时非常有用,特别是当你需要列出一个目录下的内容时。

3.1.2 函数的基本使用方法

要使用 os.listdir() 函数,首先需要导入os模块。然后,只需调用此函数并传入路径作为参数。以下是一个简单的示例:

import os

# 获取当前工作目录下的所有内容
contents = os.listdir('.')
print(contents)

输出将展示当前目录下的所有文件和目录列表。

3.2 os.listdir()应用实例

3.2.1 列出指定目录下的文件和目录

假设我们有一个名为 example_directory 的目录,我们想列出其下的所有文件和目录。

import os

# 指定目录路径
directory_path = 'example_directory'

# 尝试列出目录内容
try:
    dir_contents = os.listdir(directory_path)
    print(f"Contents of '{directory_path}':")
    for item in dir_contents:
        print(item)
except FileNotFoundError as e:
    print(f"Directory '{directory_path}' not found.")
except Exception as e:
    print(f"An error occurred: {e}")

上面的代码片段首先尝试列出指定路径下的内容。如果路径不存在,将捕获 FileNotFoundError 异常并打印相应的消息。

3.2.2 结合异常处理机制的高级应用

在实际应用中,简单的文件列表可能不足以满足需求,这时我们可以结合异常处理来增加代码的健壮性。

import os

def list_directory_contents(path):
    try:
        # 获取目录内容
        dir_contents = os.listdir(path)
        # 返回排序后的内容
        return sorted(dir_contents)
    except FileNotFoundError as fnf_error:
        print(f"The directory '{path}' does not exist.")
    except PermissionError as p_error:
        print(f"No permission to read the directory '{path}'.")
    except Exception as general_error:
        print(f"An unexpected error occurred: {general_error}")

# 使用函数
directory_path = 'example_directory'
contents = list_directory_contents(directory_path)
if contents:
    for item in contents:
        print(item)

这里定义了一个 list_directory_contents 函数,它接收一个路径参数并返回排序后的文件列表。函数使用 try...except 语句处理了 FileNotFoundError PermissionError 异常,并打印了相应的错误消息。

以上展示了 os.listdir() 在列出目录内容时的基本应用,以及如何结合异常处理机制来增强代码的可用性和健壮性。接下来的章节将探讨如何拼接路径以及遍历目录中的文件。

4. 文件路径拼接与遍历

4.1 路径拼接技巧

4.1.1 使用os.path.join()进行路径拼接

在处理文件和目录时,路径拼接是常见的操作之一。Python的os模块提供了一个非常有用的函数 os.path.join() ,它可以根据操作系统自动选择正确的路径分隔符来拼接多个路径部分。这在跨平台的文件操作中尤其重要,因为不同的操作系统使用不同的路径分隔符(如Windows使用反斜杠 \ ,而Linux和macOS使用正斜杠 / )。

使用 os.path.join() 时,只需要将路径的各个部分作为参数传递给这个函数,它会自动地在它们之间插入正确的分隔符,最终返回一个完整的路径字符串。

import os

# 在Windows系统中,路径分隔符通常是反斜杠
path_on_windows = os.path.join('folder', 'subfolder', 'file.txt')

# 在Linux或macOS系统中,路径分隔符是正斜杠
path_on_linux_macos = os.path.join('folder', 'subfolder', 'file.txt')

print("Windows路径:", path_on_windows)
print("Linux/macOS路径:", path_on_linux_macos)

4.1.2 交叉平台路径拼接问题解决

os.path.join() 不仅解决了路径拼接问题,还解决了交叉平台路径拼接问题。它会根据运行代码的操作系统自动选择合适的分隔符。这意味着开发者不需要编写额外的代码来处理不同操作系统之间的路径差异,从而提高了代码的可移植性。

例如,如果有一个需要在多个操作系统上运行的脚本,该脚本需要访问一个文件,那么开发者只需要使用 os.path.join() 来构建路径即可。

import os

# 跨平台获取当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))

# 使用os.path.join()拼接路径,无论在哪种操作系统上运行,路径都是正确的
file_path = os.path.join(script_dir, 'data', 'example.txt')

print("文件路径:", file_path)

4.2 遍历目录中的文件

4.2.1 单层目录遍历

遍历目录中的文件通常需要遍历目录树的每一个分支。为了遍历一个目录中的所有文件,可以使用 os.listdir() 函数,它会返回一个列表,包含给定目录下的所有文件和子目录名。结合 os.path.isfile() os.path.isdir() 函数可以用来判断列表中的项是文件还是目录,并进行相应的操作。

import os

# 目标目录
target_dir = '/path/to/your/directory'

# 列出目录下的所有文件和子目录
for entry in os.listdir(target_dir):
    # 构建完整的文件或目录路径
    full_path = os.path.join(target_dir, entry)
    # 判断是文件还是目录
    if os.path.isfile(full_path):
        print(f"文件: {full_path}")
    elif os.path.isdir(full_path):
        print(f"目录: {full_path}")

4.2.2 递归遍历目录中的所有文件

当需要递归地遍历一个目录及其所有子目录时,可以使用 os.walk() 。这个函数会产生目录树中的文件名,在一个三元组 (dirpath, dirnames, filenames) 中,其中 dirpath 是一个字符串,是目录的路径; dirnames 是一个列表,包含了 dirpath 下所有的子目录的名字; filenames 是一个列表,包含了非目录文件的名字。

import os

# 目标目录
target_dir = '/path/to/your/directory'

# 递归遍历目录
for dirpath, dirnames, filenames in os.walk(target_dir):
    print(f"当前目录: {dirpath}")
    # 遍历子目录
    for dirname in dirnames:
        print(f"子目录: {os.path.join(dirpath, dirname)}")
    # 遍历文件
    for filename in filenames:
        print(f"文件: {os.path.join(dirpath, filename)}")

这样,无论是单层目录还是深层目录,都可以通过 os 模块提供的函数高效地进行遍历和操作。

5. 文件数量统计方法

文件数量统计是日常工作中常见的需求,无论是在数据备份、文件管理还是系统监控等场景中,准确快速地统计文件数量都是一个重要的任务。Python 提供了多种方法可以用来完成这项工作,本章将深入探讨如何使用 os 模块和 os.walk() 函数进行文件数量统计。

5.1 统计指定目录下文件数量

统计一个目录下的文件数量是最基础的操作,可以通过简单的函数调用实现。我们将探讨两种不同的方法来完成这个任务。

5.1.1 使用 os.listdir() len() 函数

os.listdir() 函数可以列出指定目录下的所有文件和目录名。结合 len() 函数,我们可以轻松得到一个目录下的文件数量。下面是这种方法的基本实现步骤:

  1. 导入 os 模块。
  2. 使用 os.listdir() 获取目录列表。
  3. 使用 len() 函数计算列表长度,即为文件数量。
import os

def count_files_in_directory(directory):
    # 获取指定目录下的所有文件和目录名
    entries = os.listdir(directory)
    # 计算文件数量
    file_count = len(entries)
    return file_count

# 示例:统计当前目录下的文件数量
current_directory = '.'
print(f"Total files in '{current_directory}': {count_files_in_directory(current_directory)}")

5.1.2 通过 os.walk() 进行统计

虽然 os.listdir() 足以完成简单的文件计数任务,但它只能统计目录下的直接子项。对于包含子目录的情况,我们需要使用 os.walk() 函数,它能够遍历一个目录及其所有子目录下的文件和目录。

下面是使用 os.walk() 进行文件数量统计的方法:

  1. 导入 os 模块。
  2. 使用 os.walk() 遍历指定目录及其所有子目录。
  3. 遍历过程中累计所有目录项,统计文件数量。
import os

def count_files_with_subdirectories(directory):
    file_count = 0
    for dirpath, dirnames, filenames in os.walk(directory):
        file_count += len(filenames)
    return file_count

# 示例:统计指定目录及其所有子目录下的文件数量
specified_directory = 'path/to/your/directory'
print(f"Total files in '{specified_directory}' and its subdirectories: {count_files_with_subdirectories(specified_directory)}")

这种方法考虑了目录层级,更适合复杂目录结构的文件数量统计。

5.2 文件类型统计

除了统计文件数量,有时候我们可能还需要知道不同文件类型的数量,这在进行数据分析和内容管理时特别有用。本小节将介绍如何统计特定扩展名的文件数量,以及如何统计文件夹内特定类型文件的数量。

5.2.1 统计不同扩展名文件数量

统计一个目录下不同类型文件的数量,首先需要对文件名进行分析,然后根据文件扩展名进行分组统计。下面是实现这一功能的方法:

  1. 导入 os 模块。
  2. 使用 os.listdir() 获取目录下的所有文件名。
  3. 对每个文件名使用 os.path.splitext() 进行分割。
  4. 根据文件扩展名进行分组并计数。
import os

def count_files_by_extension(directory):
    extensions_count = {}
    for filename in os.listdir(directory):
        if '.' in filename:  # 忽略没有扩展名的文件
            _, extension = os.path.splitext(filename)
            extension = extension.lower()
            extensions_count[extension] = extensions_count.get(extension, 0) + 1
    return extensions_count

# 示例:统计当前目录下不同扩展名的文件数量
print("File types count in the current directory:", count_files_by_extension('.'))

5.2.2 统计文件夹内特定类型文件数量

在某些情况下,可能只需要关注特定类型的文件,比如只统计文本文件( .txt )或图片文件( .jpg , .png 等)。下面是如何实现这一功能的步骤:

  1. 导入 os 模块。
  2. 使用 os.listdir() 获取目录下的所有文件名。
  3. 设置需要统计的特定文件扩展名列表。
  4. 遍历文件名,对于匹配的扩展名进行计数。
import os

def count_specific_files(directory, extensions):
    specific_files_count = 0
    for filename in os.listdir(directory):
        _, extension = os.path.splitext(filename)
        if extension.lower() in extensions:
            specific_files_count += 1
    return specific_files_count

# 示例:统计当前目录下特定类型文件的数量
specific_extensions = ['.txt', '.jpg', '.png']
print(f"Count of specific file types in the current directory: {count_specific_files('.', specific_extensions)}")

通过上述方法,我们可以灵活地进行文件数量统计,无论是针对整个目录还是特定类型的文件。这些技术不仅有助于我们更好地管理文件系统,也为我们分析数据提供了强有力的工具。

6. Python glob模块功能介绍

6.1 glob模块概述

6.1.1 glob模块的作用与适用场景

glob 模块是Python中的一个小型工具模块,它提供了一个函数用于实现Unix shell风格的文件名模式扩展。这一功能在需要处理大量文件名并根据特定模式进行匹配时非常有用。特别适用于编写脚本处理需要特定模式匹配的文件,如批量重命名、删除或移动文件等操作。

6.1.2 glob模块与os.path通配符的区别

glob 模块与标准库中的 os.path 模块都能进行文件路径的匹配操作,但它们的工作方式和使用场景有所不同。 os.path 提供了路径处理的实用函数,例如 os.path.join() 用于路径拼接, os.path.exists() 检查路径是否存在等。 glob 模块则专门用于根据通配符模式来查找匹配的文件路径列表。简单来说, os.path 重在路径操作和管理,而 glob 则专注于通配符模式匹配。

6.2 glob模块的使用方法

6.2.1 通配符匹配文件路径

使用 glob 模块进行通配符匹配的基本用法如下:

import glob

# 匹配当前目录下所有的Python文件
pattern = '*.py'
matched_files = glob.glob(pattern)

for file in matched_files:
    print(file)

在上述代码中, glob.glob() 函数接受一个模式字符串参数,返回一个列表,列表中包含匹配该模式的所有文件路径。 * 代表任意数量的字符, *.py 即匹配所有以 .py 结尾的文件。

6.2.2 实现复杂文件路径的匹配与获取

glob 模块也可以处理复杂的路径匹配问题。例如,匹配指定目录下所有子目录中的 .txt 文件:

pattern = '/path/to/directory/**/*.txt'
matched_files = glob.glob(pattern, recursive=True)

for file in matched_files:
    print(file)

这里 ** 代表任意数量的目录,包括零个。 recursive=True 参数使模式能够递归地匹配所有子目录中的 .txt 文件。

6.2.2.1 详细解读

在上述示例中,我们演示了如何使用 glob 模块来查找当前目录下所有的 .py 文件,然后如何使用递归模式匹配指定目录及其子目录下所有的 .txt 文件。这里有几个关键点需要注意:

  • glob.glob() 函数是 glob 模块的核心,它接受模式字符串作为输入,并返回匹配该模式的所有文件路径。
  • 通配符 * 可以匹配任何数量的字符, ** 可以匹配任何数量的目录层级。
  • 通过设置 recursive=True ,我们允许 glob 进行递归搜索,这在处理有嵌套子目录的大型项目中非常实用。
# 示例代码段
import glob

# 使用递归模式匹配指定目录下所有子目录中的.txt文件
pattern = '/path/to/directory/**/*.txt'
matched_files = glob.glob(pattern, recursive=True)

# 打印匹配到的文件路径
for file in matched_files:
    print(file)

通过这段代码,我们可以得到一个包含所有匹配文件的列表,然后对列表进行进一步的操作,例如读取文件内容、检查文件元数据等。使用 glob 模块可以有效简化文件操作的代码,提高开发效率。

在实际应用中, glob 模块提供了一个高级和简便的方式来实现文件路径的模式匹配,尤其适用于复杂的文件系统操作任务。接下来的章节将继续探讨如何与 os os.path 模块结合使用,实现更高效的文件处理。

7. 子目录文件递归获取与特定类型文件匹配

在处理文件系统时,我们经常需要遍历目录结构以及筛选出特定类型的文件。Python的 os 模块和 glob 模块为我们提供了强大的工具来实现这些需求。本章将深入探讨如何递归获取子目录中的所有文件,并介绍如何结合文件名处理函数 os.path.splitext() 来匹配特定类型的文件。

7.1 递归获取子目录中的文件

在文件系统中,子目录可能包含更多的子目录,形成一个多层次的目录树。为了获取所有子目录中的文件,我们可以使用 os.walk() 函数,它可以遍历目录树,并返回每个目录中的文件列表。

7.1.1 使用os.walk()遍历子目录

os.walk() 是递归遍历目录树的基本工具。它生成当前目录下的文件名以及子目录名,并且可以递归地在每个子目录中调用自身。 os.walk() 返回一个生成器,每次迭代返回一个三元组 (dirpath, dirnames, filenames)

  • dirpath :一个字符串,代表目录的路径。
  • dirnames :一个列表,包含 dirpath 下所有子目录的名字。
  • filenames :一个列表,包含 dirpath 下非目录文件的名字。

下面是一个使用 os.walk() 遍历目录的示例:

import os

def list_files_recursively(root_dir):
    for dirpath, dirnames, filenames in os.walk(root_dir):
        for filename in filenames:
            file_path = os.path.join(dirpath, filename)
            print(file_path)

# 使用示例
list_files_recursively('/path/to/directory')

7.1.2 递归函数实现文件路径的收集

我们可以使用递归函数来遍历子目录,这在某些情况下比 os.walk() 更为灵活。下面是一个递归函数的示例,用于收集给定目录下的所有文件路径:

import os

def recursive_list_files(root_dir):
    file_paths = []
    for entry in os.scandir(root_dir):
        if entry.is_dir(follow_symlinks=False):
            file_paths.extend(recursive_list_files(entry.path))
        elif entry.is_file(follow_symlinks=False):
            file_paths.append(entry.path)
    return file_paths

# 使用示例
files = recursive_list_files('/path/to/directory')
for file in files:
    print(file)

这个函数使用 os.scandir() 代替 os.listdir() ,因为它提供了额外的元数据信息,并且性能更优。

7.2 匹配特定类型文件

在处理文件时,我们经常需要针对特定类型的文件进行操作。例如,如果我们只需要处理 .txt 文件,我们可以结合 os.path.splitext() 函数来分离文件名和扩展名,并进行匹配。

7.2.1 结合os.path.splitext()过滤文件类型

os.path.splitext() 函数用于将文件名的扩展名分离出来,返回一个元组 (root, ext) ,其中 root 是扩展名前的文件名部分, ext 是扩展名部分。

下面是如何使用 os.path.splitext() 来获取特定类型的文件列表:

import os

def filter_files_by_extension(directory, extension):
    filtered_files = []
    for dirpath, dirnames, files in os.walk(directory):
        for file in files:
            if os.path.splitext(file)[1] == extension:
                full_path = os.path.join(dirpath, file)
                filtered_files.append(full_path)
    return filtered_files

# 使用示例
txt_files = filter_files_by_extension('/path/to/directory', '.txt')
for file in txt_files:
    print(file)

7.2.2 实现指定目录下特定类型文件的搜索与获取

结合上述的递归文件获取方法,我们可以创建一个函数来搜索特定目录下所有子目录中的特定类型文件。这个函数利用前几节介绍的 recursive_list_files filter_files_by_extension

def find_specific_files(directory, extension):
    all_files = recursive_list_files(directory)
    specific_files = [file for file in all_files if os.path.splitext(file)[1] == extension]
    return specific_files

# 使用示例
specific_files = find_specific_files('/path/to/directory', '.txt')
for file in specific_files:
    print(file)

这个函数首先收集了目录树中所有的文件,然后过滤出扩展名为 .txt 的文件。

通过本章的讨论,我们学习了如何使用Python递归遍历子目录中的文件以及如何匹配特定类型的文件。这些技能在处理复杂的文件系统操作时非常有用,能够帮助我们高效地管理文件资源。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在IT领域,文件和目录操作是基础技能之一。本文以Python语言为例,详细介绍了如何使用 os glob 模块获取指定目录下的文件路径和文件名,统计文件数量,以及递归地处理子目录。掌握这些技能对于文件管理、数据处理和自动化脚本编写等任务至关重要。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐