Python
如何在Python中轻松获取目录中的所有文件:初学者指南

如何在Python中轻松获取目录中的所有文件:初学者指南

MoeNagy Dev

理解文件路径

绝对路径与相对路径

在Python中,你可以同时使用绝对路径和相对路径来操作文件路径。绝对路径是指从文件系统的根目录开始的文件或目录的完整且无歧义的位置。相对路径则是相对于当前工作目录或文件系统中特定位置的路径。

下面是在Python中使用绝对路径和相对路径的示例:

# 绝对路径
absolute_path = "/Users/username/documents/file.txt"
 
# 相对路径
relative_path = "documents/file.txt"

你可以使用 os.path.abspath() 函数将相对路径转换为绝对路径:

import os
 
relative_path = "documents/file.txt"
absolute_path = os.path.abspath(relative_path)
print(absolute_path)
# 输出:/Users/username/documents/file.txt

使用Python浏览文件系统

Python中的 osos.path 模块提供了一组用于浏览文件系统的函数。以下是一些常用的函数:

  • os.getcwd():返回当前工作目录。
  • os.chdir(path):将当前工作目录更改为指定的路径。
  • os.path.join(path1, path2, ...):智能地连接一个或多个路径组件。
  • os.path.dirname(path):返回指定路径的目录名。
  • os.path.basename(path):返回指定路径的基本文件名。

示例:

import os
 
# 获取当前工作目录
current_dir = os.getcwd()
print(current_dir)
 
# 更改当前工作目录
os.chdir("/Users/username/documents")
new_dir = os.getcwd()
print(new_dir)
 
# 连接路径
file_path = os.path.join(new_dir, "file.txt")
print(file_path)
 
# 获取目录名和基本文件名
dir_name = os.path.dirname(file_path)
base_name = os.path.basename(file_path)
print(dir_name)
print(base_name)

获取目录中文件的列表

使用 os.listdir() 函数

要获取指定目录中的文件和目录列表,可以使用 os.listdir() 函数。该函数返回指定目录中所有项目(文件和目录)的列表。

示例:

import os
 
# 获取当前目录中的文件和目录列表
items = os.listdir(".")
print(items)

过滤文件列表

你可以通过检查每个项目的类型,使用 os.path.isfile()os.path.isdir() 函数来过滤文件和目录列表。

示例:

import os
 
# 获取当前目录中的文件和目录列表
items = os.listdir(".")
 
# 过滤列表,仅获取文件
files = [item for item in items if os.path.isfile(item)]
print(files)
 
# 过滤列表,仅获取目录
directories = [item for item in items if os.path.isdir(item)]
print(directories)

处理子目录

递归遍历子目录

要遍历子目录并获取目录树中所有文件的列表,可以使用递归方法。这涉及在函数内部调用相同的函数或逻辑来处理子目录。

示例:

import os
 
def get_all_files(directory):
    all_files = []
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            all_files.append(item_path)
        elif os.path.isdir(item_path):
            all_files.extend(get_all_files(item_path))
    return all_files
 
# 获取当前目录及子目录中的所有文件
all_files = get_all_files(".")
print(all_files)

区分目录与文件

你可以使用 os.path.isfile()os.path.isdir() 函数来确定文件系统中的项是文件还是目录。

示例:

import os
 
# 检查路径是否为文件
if os.path.isfile("file.txt"):
    print("这是一个文件!")
else:
    print("这不是一个文件。")
 
# 检查路径是否为目录
if os.path.isdir("documents"):
    print("这是一个目录!")
else:
    print("这不是一个目录。")

使用 os.walk() 函数

探索 os.walk() 函数

os.walk() 函数提供了一种更方便的递归遍历目录树并获取所有文件和目录列表的方法。它对于每个目录在树中生成一个3元组(tuple):

  1. 根目录
  2. 根目录中子目录的名称列表(不包括 '.''..'
  3. 根目录中非目录文件的名称列表

示例:

import os
 
for root, dirs, files in os.walk("."):
    print(f"根目录:{root}")
    print(f"子目录:{dirs}")
    print(f"文件:{files}")
    print()

自定义 os.walk() 行为

你可以通过提供其他参数来自定义 os.walk() 的行为:

  • topdown:如果为 Trueos.walk() 按照目录树中的顺序访问目录(默认为 True)。
  • onerror:当 os.walk() 遇到错误时调用的函数。该函数应该接受一个参数,一个 OSError 实例。
  • followlinks:如果为 Trueos.walk() 将跟随符号链接(默认为 False)。

示例:

import os
 
for root, dirs, files in os.walk(".", topdown=False, onerror=lambda err: print(f"错误:{err}"), followlinks=True):
    print(f"根目录:{root}")
    print(f"子目录:{dirs}")
    print(f"文件:{files}")
    print()

按文件扩展名过滤文件

检查文件扩展名

可以使用os.path.splitext()函数检查文件的扩展名,该函数返回一个包含路径的根和扩展名的2元组。

示例:

import os
 
file_path = "documents/file.txt"
root, ext = os.path.splitext(file_path)
print(f"根目录: {root}")
print(f"扩展名: {ext}")

创建特定扩展名文件列表

可以将文件扩展名检查与目录遍历技术结合起来,创建特定扩展名文件的列表。

示例:

import os
 
def get_files_by_extension(directory, extension):
    all_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                file_path = os.path.join(root, file)
                all_files.append(file_path)
    return all_files
 
# 获取当前目录和子目录中的所有.txt文件
txt_files = get_files_by_extension(".", ".txt")
print(txt_files)

对文件列表进行排序和组织

对文件列表进行排序

可以根据各种条件,例如文件名称、大小或修改时间对文件列表进行排序。Python中的sorted()函数允许您对文件列表进行排序。

示例:

import os
 
# 获取当前目录中的文件列表
files = os.listdir(".")
 
# 按名称对文件进行排序
sorted_files = sorted(files)
print(sorted_files)
 
# 按大小对文件进行排序
file_sizes = [(file, os.path.getsize(file)) for file in files]
sorted_by_size = sorted(file_sizes, key=lambda x: x[1])
print(sorted_by_size)

按扩展名分组文件

可以按文件的扩展名将文件分组,并创建一个字典或类似的数据结构来组织文件。

示例:

import os
from collections import defaultdict
 
def group_files_by_extension(directory):
    file_groups = defaultdict(list)
    for root, dirs, files in os.walk(directory):
        for file in files:
            _, ext = os.path.splitext(file)
            file_path = os.path.join(root, file)
            file_groups[ext].append(file_path)
    return file_groups
 
# 对当前目录和子目录中的文件进行分组
file_groups = group_files_by_extension(".")
for extension, files in file_groups.items():
    print(f"{extension}: {files}")

处理错误和边缘情况

处理权限和访问问题

在使用文件系统时,可能会遇到权限或访问问题。可以使用try-except块处理这些错误,并提供适当的错误处理。

示例:

import os
 
def get_file_info(file_path):
    try:
        file_size = os.path.getsize(file_path)
        last_modified = os.path.getmtime(file_path)
        return file_size, last_modified
    except OSError as e:
        print(f"访问文件 {file_path} 出错: {e}")
        return None, None
 
# 获取文件的文件信息
file_info = get_file_info("file.txt")
if file_info[0] is not None:
    file_size, last_modified = file_info
    print(f"文件大小: {file_size} 字节")
    print(f"最后修改时间: {last_modified}")

处理符号链接和其他特殊文件

Python的osos.path模块可以处理各种类型的特殊文件,例如符号链接、命名管道和设备文件。可以使用os.path.islink()函数检查文件是否为符号链接。

示例:

import os
 
def handle_special_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.islink(file_path):
                print(f"符号链接: {file_path}")
            elif os.path.isfifo(file_path):
                print(f"命名管道: {file_path}")
            elif os.path.isdev(file_path):
                print(f"设备文件: {file_path}")
            else:
                print(f"常规文件: {file_path}")
 
# 处理当前目录和子目录中的特殊文件
handle_special_files(".")

数据结构

列表

列表是Python中最基本的数据结构之一。它们是有序的项目集合,可以保存不同数据类型的值,包括数字、字符串,甚至是其他数据结构,如列表或字典。

以下是创建列表并执行一些常见操作的示例:

# 创建列表
fruits = ['苹果', '香蕉', '樱桃']
 
# 访问元素
print(fruits[0])  # 输出: '苹果'
print(fruits[-1])  # 输出: '樱桃'
 
# 添加元素
fruits.append('橙子')
print(fruits)  # 输出: ['苹果', '香蕉', '樱桃', '橙子']
 
# 删除元素
fruits.remove('香蕉')
print(fruits)  # 输出: ['苹果', '樱桃', '橙子']
 
# 切片
print(fruits[1:3])  # 输出: ['樱桃', '橙子']

元组

元组与列表类似,但它们是不可变的,这意味着创建后无法修改其内容。元组使用圆括号()定义,而不是方括号[]

# 创建元组
point = (2, 3)
print(point)  # 输出: (2, 3)
 
# 访问元素
print(point[0])  # 输出: 2
print(point[1])  # 输出: 3
 
# 解包元组
x, y = point
print(x)  # 输出: 2
print(y)  # 输出: 3

字典

字典是无序的键值对集合。它们允许您使用唯一的键快速存储和检索数据。

# 创建字典
person = {
    '姓名': '约翰·多伊',
    '年龄': 30,
    '城市': '纽约'
}
 
# 访问值
print(person['姓名'])  # 输出: '约翰·多伊'
print(person['年龄'])  # 输出: 30
 
# 添加和修改条目
person['邮箱'] = 'john.doe@example.com'
person['年龄'] = 31
print(person)  # 输出: {'姓名': '约翰·多伊', '年龄': 31, '城市': '纽约', '邮箱': 'john.doe@example.com'}
 
# 遍历字典
for key, value in person.items():
    print(f"{key}: {value}")

集合

集合

集合是无序的唯一元素的集合。它们用于执行并集、交集和差集等操作。

# 创建集合
colors = {'red', 'green', 'blue'}
print(colors)  # 输出: {'red', 'green', 'blue'}
 
# 添加和删除元素
colors.add('yellow')
colors.remove('green')
print(colors)  # 输出: {'red', 'blue', 'yellow'}
 
# 集合操作
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 | set2)  # 并集: {1, 2, 3, 4}
print(set1 & set2)  # 交集: {2, 3}
print(set1 - set2)  # 差集: {1}

控制流程

条件语句

条件语句,如 if-elseif-elif-else,允许您根据特定条件执行不同的代码块。

# if-else 语句
age = 18
if age >= 18:
    print("你已经成年了。")
else:
    print("你还是未成年。")
 
# if-elif-else 语句
score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("D")

循环

循环,如 forwhile,允许您重复执行一段代码块。

# for 循环
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# while 循环
count = 0
while count < 5:
    print(count)
    count += 1

列表推导式

列表推导式提供了一种基于现有列表创建新列表的简洁方式。

# 列表推导式
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
print(squares)  # 输出: [1, 4, 9, 16, 25]
 
# 条件列表推导式
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # 输出: [2, 4]

函数

函数是可重用的代码块,用于执行特定的任务。它们可以接受参数、返回值,并帮助您组织代码。

# 定义函数
def greet(name):
    print(f"你好,{name}!")
 
# 调用函数
greet("Alice")  # 输出: 你好,Alice!
 
# 带有返回值的函数
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 输出: 7

模块和包

Python 的广泛标准库和第三方包提供了丰富的功能,可以在您的项目中利用这些功能。

# 导入模块
import math
print(math.pi)  # 输出: 3.141592653589793
 
# 从模块导入特定函数
from math import sqrt, floor
print(sqrt(16))  # 输出: 4.0
print(floor(3.7))  # 输出: 3
 
# 导入包
import datetime
print(datetime.datetime.now())  # 输出: 2023-04-24 12:34:56.789012

异常处理

异常处理允许您在代码中优雅地处理错误和意外情况。

# 处理异常
try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误:除以零。")
 
# 处理多个异常
try:
    int('abc')
except ValueError:
    print("错误:无效的整数格式。")

文件 I/O

Python 提供了用于读取和写入文件的内置函数和方法。

# 写入文件
with open('example.txt', 'w') as file:
    file.write("你好,世界!")
 
# 从文件中读取
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # 输出: 你好,世界!

结论

在本 Python 教程中,您学习了各种数据结构、控制流程、函数、模块和包、异常处理以及文件 I/O。这些概念构成了 Python 编程的基础,将帮助您编写更高效、易于维护的代码。请记得定期练习,并探索Python库和框架的广阔生态系统,以扩展您的知识和技能。

MoeNagy Dev