Python
使用Python轻松地在目录中检索文件

使用Python轻松地在目录中检索文件

MoeNagy Dev

使用Python获取目录中的所有文件

os.listdir()的威力

理解os.listdir()函数

os.listdir()函数是Python标准库中的一项强大工具,允许您检索指定目录中所有文件和目录的列表。这个函数是os模块的一部分,该模块提供了与操作系统进行交互的方式。

下面是如何使用os.listdir()的基本示例:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
print(file_list)

这段代码会输出指定directory_path内所有文件和目录的列表。

列出目录中的所有文件

要获取仅包含文件(而不是目录)的列表,可以使用以下方法:

import os
 
directory_path = '/path/to/directory'
file_list = [f for f in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, f))]
print(file_list)

在这个例子中,我们使用列表推导式来过滤os.listdir()返回的列表,只包括那些是文件(而不是目录)的项,使用os.path.isfile()函数。

处理子目录和递归文件检索

如果您想要从指定目录以及其子目录中检索文件,可以使用递归方法。下面是一个示例:

import os
 
def get_all_files(directory_path):
    file_list = []
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            file_list.append(os.path.join(root, file))
    return file_list
 
directory_path = '/path/to/directory'
all_files = get_all_files(directory_path)
print(all_files)

在这个例子中,我们定义了一个get_all_files()函数,该函数使用os.walk()函数递归遍历目录树。对于遇到的每个文件,我们使用os.path.join()构建完整的文件路径,并将其添加到file_list中。

按文件扩展名筛选文件

指定要包含的文件扩展名

要仅检索具有特定文件扩展名的文件,可以使用以下方法:

import os
 
directory_path = '/path/to/directory'
allowed_extensions = ['.txt', '.py', '.jpg']
 
file_list = [f for f in os.listdir(directory_path) if any(f.endswith(ext) for ext in allowed_extensions)]
print(file_list)

在这个例子中,我们定义了一个allowed_extensions的列表,然后使用列表推导式来过滤os.listdir()返回的文件列表,只包含具有指定扩展名之一的文件。

排除特定的文件扩展名

类似地,您可以通过修改列表推导式来排除特定的文件扩展名:

import os
 
directory_path = '/path/to/directory'
excluded_extensions = ['.pyc', '.log']
 
file_list = [f for f in os.listdir(directory_path) if not any(f.endswith(ext) for ext in excluded_extensions)]
print(file_list)

在这里,我们定义了一个excluded_extensions列表,然后使用列表推导式来过滤文件列表,排除具有指定扩展名之一的文件。

处理多个文件扩展名

您还可以使用集合或字典以更灵活的方式处理多个文件扩展名:

import os
 
directory_path = '/path/to/directory'
allowed_extensions = {'.txt', '.py', '.jpg'}
 
file_list = [f for f in os.listdir(directory_path) if any(f.endswith(ext) for ext in allowed_extensions)]
print(file_list)

在这个例子中,我们使用一个allowed_extensions的集合而不是列表。这使我们能够轻松添加或删除扩展名,而不需要修改列表推导式。

对文件列表进行排序和整理

按字母顺序排序文件列表

要按字母顺序对文件列表进行排序,可以使用内置的sorted()函数:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
sorted_file_list = sorted(file_list)
print(sorted_file_list)

这将按升序排列文件列表。

按文件大小或修改日期排序

要按文件大小或修改日期对文件列表进行排序,可以使用os.path.getsize()os.path.getmtime()函数,分别:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
 
# 按文件大小排序
sorted_by_size = sorted(file_list, key=lambda x: os.path.getsize(os.path.join(directory_path, x)))
print(sorted_by_size)
 
# 按修改日期排序
sorted_by_date = sorted(file_list, key=lambda x: os.path.getmtime(os.path.join(directory_path, x)))
print(sorted_by_date)

在第一个示例中,我们使用带有自定义键函数的sorted()函数,该函数使用os.path.getsize()来获取文件大小。在第二个示例中,我们使用os.path.getmtime()获取的修改日期作为排序键。

按文件扩展名分组

要按照文件扩展名分组文件,可以使用字典来存储按扩展名分组的文件:

import os
from collections import defaultdict
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
 
file_groups = defaultdict(list)
for filename in file_list:
    extension = os.path.splitext(filename)[1].lower()
    file_groups[extension].append(filename)
 
for extension, files in file_groups.items():
    print(f"具有扩展名'{extension}'的文件:{', '.join(files)}")

在这个示例中,我们使用collections模块中的defaultdict来创建一个字典,该字典将自动初始化空列表以供新的文件扩展名使用。然后,我们遍历文件列表,使用os.path.splitext()提取文件扩展名,并将文件名添加到file_groups字典中相应的列表中。

使用Pathlib进行工作

简介Pathlib模块

Python中的pathlib模块提供了一种面向对象的方式来处理文件路径。与传统的os.path模块相比,它提供了一种更直观和跨平台的方法。

使用Pathlib列出文件

以下是如何使用pathlib列出目录中文件的示例:

from pathlib import Path
 
directory_path = '/path/to/directory'
file_list = [p.name for p in Path(directory_path).glob('*')]
print(file_list)

在这个示例中,我们使用pathlib模块的Path类来表示目录路径。然后使用glob()方法来获取指定目录中的所有文件和目录的列表。

使用Pathlib访问文件元数据

您还可以使用pathlib轻松访问文件元数据,比如文件大小和修改日期:

from pathlib import Path
 
file_path = '/path/to/file.txt'
file_path = Path(file_path)
 
print(f"文件名: {file_path.name}")
print(f"文件大小: {file_path.stat().st_size} 字节")
print(f"修改时间: {file_path.stat().st_mtime}")

这段代码演示了如何使用pathlib.Path对象检索文件名、文件大小和修改时间。

处理隐藏文件和目录

识别隐藏文件和目录

在许多文件系统中,以点开始的文件和目录(例如.gitignore)被认为是“隐藏”文件,通常不在目录列表中显示。要包括或排除这些隐藏项,您可以使用以下方法:

import os
 
directory_path = '/path/to/directory'
all_items = os.listdir(directory_path)
visible_items = [item for item in all_items if not item.startswith('.')]
hidden_items = [item for item in all_items if item.startswith('.')]
 
print("可见项目:", visible_items)
print("隐藏项目:", hidden_items)

在这个示例中,我们首先使用os.listdir()获取目录中的项目的完整列表。然后使用两个列表推导式根据项目名称是否以点开头来区分可见项目和隐藏项目。

选择是否包括或排除它们

根据您的用例,您可能希望包括或排除隐藏的文件和目录。以下是如何处理这种情况的示例:

import os
 
directory_path = '/path/to/directory'
include_hidden = False
 
all_items = os.listdir(directory_path)
if include_hidden:
    file_list = all_items
else:
    file_list = [item for item in all_items if not item.startswith('.')]
 
print(file_list)

在这个示例中,我们引入了一个布尔变量include_hidden,用于控制是否将隐藏项目包含在最终的文件列表中。

自定义文件搜索行为

您还可以通过创建允许您指定包括或排除文件和目录的自定义规则的函数来进一步自定义文件搜索行为:

import os
 
def get_file_list(directory_path, include_hidden=False, allowed_extensions=None, excluded_extensions=None):
    all_items = os.listdir(directory_path)
    file_list = []
 
    for item in all_items:
        item_path = os.path.join(directory_path, item)
        if os.path.isfile(item_path):
            if allowed_extensions:
                if any(item.endswith(ext) for ext in allowed_extensions):
                    file_list.append(item)
            elif excluded_extensions:
                if not any(item.endswith(ext) for ext in excluded_extensions):
                    file_list.append(item)
            else:
                file_list.append(item)
        elif include_hidden or not item.startswith('.'):
            file_list.append(item)
 
    return file_list
 
# 示例用法
directory_path = '/path/to/directory'
file_list = get_file_list(directory_path, include_hidden=False, allowed_extensions=['.txt', '.py'])
print(file_list)

在这个示例中,get_file_list()函数允许您指定是否包括隐藏的文件和目录,以及要包括或排除的文件扩展名。这提供了一种灵活和可定制的方式,根据特定要求检索文件列表。

结合os.listdir()和os.path.join()

使用os.path.join()构建完整的文件路径

当使用os.listdir()检索到的文件列表时,通常需要构建完整的文件路径。您可以使用os.path.join()函数来实现此目的:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
full_file_paths = [os.path.join(directory_path, filename) for filename in file_list]
print(full_file_paths)

在这个示例中,我们使用列表推导式遍历文件列表,并使用os.path.join()将目录路径和各个文件名连接起来构建完整的文件路径。

遍历目录并构建文件列表

您可以组合使用os.listdir()os.path.join()以更高效的方式构建文件列表:

import os
 
def get_file_list(directory_path):
    file_list = []
    for filename in os.listdir(directory_path):
        file_path = os.path.join(directory_path, filename)
        if os.path.isfile(file_path):
            file_list.append(file_path)
    return file_list
 
directory_path = '/path/to/directory'
all_files = get_file_list(directory_path)
print(all_files)
 
## 数据结构
 
### 列表
---
layout: post
title: 列表、元组、字典和集合
language: zh
---
 
列表(List)是Python中最基本的数据结构之一。它们是有序的项目集合,可以包含不同类型的数据。你可以使用方括号`[]`来创建一个列表,并用逗号分隔项目。
 
```python
fruits = ['apple', 'banana', 'cherry']
print(fruits)  # 输出:['apple', 'banana', 'cherry']

通过索引访问列表中的元素,索引从 0 开始。

print(fruits[0])  # 输出:'apple'
print(fruits[1])  # 输出:'banana'

也可以使用负索引来从列表末尾访问元素。

print(fruits[-1])  # 输出:'cherry'
print(fruits[-2])  # 输出:'banana'

列表支持许多操作,如切片(slicing)、连接和修改。

# 切片(Slicing)
print(fruits[1:3])  # 输出:['banana', 'cherry']
 
# 连接(Concatenation)
more_fruits = ['orange', 'kiwi']
all_fruits = fruits + more_fruits
print(all_fruits)  # 输出:['apple', 'banana', 'cherry', 'orange', 'kiwi']
 
# 修改(Modification)
fruits[0] = 'pear'
print(fruits)  # 输出:['pear', 'banana', 'cherry']

元组

元组(Tuple)类似于列表,但它们是不可变的,也就是说,在创建后无法修改其元素。元组使用圆括号()来定义,而不是方括号。

point = (3, 4)
print(point)  # 输出:(3, 4)
print(point[0])  # 输出:3
print(point[1])  # 输出:4

当您想要存储一组固定的值(例如坐标或数据库记录)时,元组会很有用。

字典

字典(Dictionary)是无序的键-值对集合。字典使用大括号{}来定义,键和值之间使用冒号分隔。

person = {
    'name': 'John Doe',
    'age': 35,
    'occupation': 'Software Engineer'
}
print(person)  # 输出:{'name': 'John Doe', 'age': 35, 'occupation': 'Software Engineer'}

您可以使用键来访问字典中的值。

print(person['name'])  # 输出:'John Doe'
print(person['age'])  # 输出:35

字典非常灵活,可以用于存储各种类型的数据,包括列表和其他字典。

person = {
    'name': 'John Doe',
    'age': 35,
    'hobbies': ['reading', 'hiking', 'photography'],
    'address': {
        'street': '123 Main St',
        'city': 'Anytown',
        'state': 'CA'
    }
}
 
print(person['hobbies'])  # 输出:['reading', 'hiking', 'photography']
print(person['address']['city'])  # 输出:'Anytown'

集合

集合(Set)是无序的唯一元素的集合。集合使用大括号{}来定义,元素之间用逗号分隔。

colors = {'red', 'green', 'blue'}
print(colors)  # 输出:{'red', 'green', 'blue'}

您可以使用集合执行各种操作,如并集、交集和差集。

colors1 = {'red', 'green', 'blue'}
colors2 = {'green', 'yellow', 'orange'}
 
# 并集
all_colors = colors1 | colors2
print(all_colors)  # 输出:{'red', 'green', 'blue', 'yellow', 'orange'}
 
# 交集
common_colors = colors1 & colors2
print(common_colors)  # 输出:{'green'}
 
# 差集
unique_colors1 = colors1 - colors2
print(unique_colors1)  # 输出:{'red', 'blue'}

控制流

条件语句

在Python中,您可以使用条件语句根据一定的条件来控制程序的流程。

if-elif-else语句是最常见的实现条件逻辑的方式。

age = 25
if age < 18:
    print("你是未成年人。")
elif age < 65:
    print("你是成年人。")
else:
    print("你是老年人。")

您还可以使用三元运算符,这是一种简写的if-else语句。

is_student = True
status = "学生" if is_student else "非学生"
print(status)  # 输出: "学生"

循环

在Python中,循环允许您重复执行一块代码。最常见的循环类型是for循环和while循环。

for循环用于迭代一个序列,如列表或字符串。

fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)

while循环用于在某个条件为真时重复执行一块代码。

count = 0
while count < 5:
    print(count)
    count += 1

您还可以使用breakcontinue语句来控制循环的流程。

for i in range(10):
    if i == 5:
        break
    print(i)  # 输出:0 1 2 3 4
 
for j in range(10):
    if j % 2 == 0:
        continue
    print(j)  # 输出:1 3 5 7 9

函数

Python中的函数是可重复使用的代码块,用于执行特定的任务。使用def关键字来定义函数。

def greet(name):
    print(f"你好,{name}!")
 
greet("Alice")  # 输出: "你好,Alice!"

函数还可以使用return语句返回值。

def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 输出:7

您还可以定义具有默认参数值和可变长度参数的函数。

def print_info(name, age=30, *args):
    print(f"姓名:{name}")
    print(f"年龄:{age}")
    print("其他信息:")
    for arg in args:
        print(arg)
 
print_info("John", 35, "软件工程师", "喜欢徒步旅行")

模块和包

在Python中,您可以将代码组织成模块和包,以使其更模块化和可重用。

模块是一个包含函数、类和变量的单个Python文件。您可以使用import语句导入模块。

import math
print(math.pi)  # 输出:3.141592653589793

您还可以使用from关键字从模块中导入特定的项。

from math import sqrt
print(sqrt(16))  # 输出:4.0

包是相关模块的集合。它们是以包含__init__.py文件的目录组织起来的。

my_package/
__init__.py
module1.py
module2.py

您可以使用点表示法从包中导入项目。

```python
import my_package.module1
result = my_package.module1.my_function()

异常处理

Python的异常处理机制允许你处理代码中的运行时错误和意外情况。

你可以使用try-except语句来捕获和处理异常。

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误:除以零")

你还可以处理多个异常并提供默认的except块。

try:
    num = int(input("请输入一个数字:"))
    print(10 / num)
except ValueError:
    print("错误:无效的输入")
except ZeroDivisionError:
    print("错误:除以零")
except:
    print("发生了一个未知错误")

你还可以使用raise语句引发自己的异常。

def withdraw(balance, amount):
    if amount > balance:
        raise ValueError("余额不足")
    return balance - amount
 
try:
    new_balance = withdraw(100, 150)
except ValueError as e:
    print(e)

结论

在本教程中,您学习了Python中的各种数据结构、控制流语句、函数、模块和异常处理。这些概念对于构建更复杂和健壮的Python应用程序是必不可少的。记得练习和实验提供的示例,以巩固对这些主题的理解。

MoeNagy Dev