Python
快速获取目录中的文件列表:Python指南

快速获取目录中的文件列表:Python指南

MoeNagy Dev

探索os和os.path模块

os和os.path模块概述

Python中的osos.path模块提供了与操作系统文件系统交互的跨平台方法。这些模块提供了广泛的功能,从列出目录中的文件到管理文件和目录路径。

访问当前工作目录

您可以使用os.getcwd()函数来获取当前工作目录:

import os
 
current_dir = os.getcwd()
print(current_dir)

这将输出当前工作目录的绝对路径。

列出当前目录中的文件

os.listdir()函数可用于列出当前工作目录中的所有文件和目录:

import os
 
files_and_dirs = os.listdir()
print(files_and_dirs)

这将返回当前目录中所有项(文件和目录)的列表。

使用os.listdir()函数

os.listdir()基础

os.listdir()函数接受一个可选参数,该参数是要列出内容的目录的路径。如果未提供参数,则会列出当前工作目录的内容。

import os
 
# 列出当前目录中的文件
files_and_dirs = os.listdir()
print(files_and_dirs)
 
# 列出特定目录中的文件
specific_dir = "/path/to/directory"
files_and_dirs = os.listdir(specific_dir)
print(files_and_dirs)

列出特定目录中的文件

要列出特定目录中的文件,请将目录的路径作为参数传递给os.listdir()

import os
 
specific_dir = "/path/to/directory"
files_and_dirs = os.listdir(specific_dir)
print(files_and_dirs)

这将返回指定目录中所有项(文件和目录)的列表。

处理相对路径和绝对路径

您可以在os.listdir()中使用相对路径和绝对路径。相对路径是相对于当前工作目录解释的,而绝对路径是解释为目录的完整路径。

import os
 
# 使用相对路径
rel_path = "documents"
files_and_dirs = os.listdir(rel_path)
print(files_and_dirs)
 
# 使用绝对路径
abs_path = "/home/user/documents"
files_and_dirs = os.listdir(abs_path)
print(files_and_dirs)

过滤文件列表

从列表中排除目录

如果您只想列出目录中的文件而不包括目录本身,可以使用os.path.isfile()函数来过滤列表:

import os
 
directory = "/path/to/directory"
all_items = os.listdir(directory)
files = [item for item in all_items if os.path.isfile(os.path.join(directory, item))]
print(files)

这将创建一个新列表files,其中只包含文件名,而不包括任何目录。

按文件扩展名过滤

要按文件扩展名过滤文件列表,可以使用列表推导式:

import os
 
directory = "/path/to/directory"
all_items = os.listdir(directory)
txt_files = [item for item in all_items if item.endswith(".txt")]
print(txt_files)

这将创建一个新列表txt_files,其中只包含具有.txt扩展名的文件名。

使用高级过滤的列表推导式

可以使用列表推导式来应用更复杂的过滤逻辑。例如,要获取具有特定扩展名且大于某个特定大小的文件列表:

import os
 
directory = "/path/to/directory"
all_items = os.listdir(directory)
large_csv_files = [
    item
    for item in all_items
    if item.endswith(".csv") and os.path.getsize(os.path.join(directory, item)) > 1024 * 1024
]
print(large_csv_files)

这将创建一个新列表large_csv_files,其中只包含目录中大于1 MB的CSV文件。

递归列出子目录中的文件

使用os.walk()探索子目录

os.walk()函数可用于递归遍历目录树并列出子目录中的所有文件。它返回一个生成器,对于每个访问的目录,它会生成一个三元组:目录的路径,该目录中的目录列表,以及该目录中的文件列表。

import os
 
directory = "/path/to/directory"
for root, dirs, files in os.walk(directory):
    for file in files:
        print(os.path.join(root, file))

这将打印出目录树中每个文件的完整路径,从指定的directory开始。

以递归方式处理文件路径

在使用os.walk()时,您需要正确处理文件路径,尤其是在处理子目录时。可以使用os.path.join()函数将目录路径和文件名结合起来构造文件的完整路径。

import os
 
directory = "/path/to/directory"
for root, dirs, files in os.walk(directory):
    for file in files:
        full_path = os.path.join(root, file)
        print(full_path)

这将打印出每个文件的完整路径,考虑到目录结构。

自定义输出格式

您可以自定义输出格式以适应您的需求。例如,您可以打印文件大小和修改时间以及文件路径:

import os
from datetime import datetime
 
directory = "/path/to/directory"
for root, dirs, files in os.walk(directory):
    for file in files:
        full_path = os.path.join(root, file)
```python
import os
 
# 获取文件大小
file_size = os.path.getsize(full_path)
# 获取文件修改时间
mod_time = os.path.getmtime(full_path)
# 将修改时间格式化为字符串
mod_time_str = datetime.fromtimestamp(mod_time).strftime("%Y-%m-%d %H:%M:%S")
# 打印文件路径、大小和修改时间
print(f"{full_path} - 大小: {file_size} 字节 - 修改时间: {mod_time_str}")

这段代码将打印目录树中每个文件的文件路径、大小和修改时间。

使用 os.path 模块

使用 os.path.join() 连接路径

os.path.join() 函数用于智能地连接一个或多个路径组件以构建文件路径。根据操作系统的不同,它会处理适当的路径分隔符(例如,在类Unix系统上使用正斜杠,在Windows上使用反斜杠)。

import os
 
directory = "/path/to/directory"
filename = "example.txt"
full_path = os.path.join(directory, filename)
print(full_path)

这将输出文件的完整路径,并在当前操作系统上使用适当的路径分隔符。

检查路径是否为文件或目录

os.path.isfile()os.path.isdir() 函数可以用于检查给定路径是否分别表示文件或目录。

import os
 
path = "/path/to/file.txt"
if os.path.isfile(path):
    print(f"{path} 是一个文件。")
else:
    print(f"{path} 不是一个文件。")
 
path = "/path/to/directory"
if os.path.isdir(path):
    print(f"{path} 是一个目录。")
else:
    print(f"{path} 不是一个目录。")

获取文件大小和修改时间

os.path.getsize()os.path.getmtime() 函数可以用于分别获取文件的大小和最后修改时间。

import os
from datetime import datetime
 
path = "/path/to/file.txt"
file_size = os.path.getsize(path)
mod_time = os.path.getmtime(path)
mod_time_str = datetime.fromtimestamp(mod_time).strftime("%Y-%m-%d %H:%M:%S")
print(f"文件大小: {file_size} 字节")
print(f"最后修改时间: {mod_time_str}")

这将输出文件的大小(以字节为单位)和最后修改时间。

处理跨平台兼容性

处理操作系统间的差异

osos.path 模块旨在提供一个跨平台的接口,但在处理不同操作系统之间的文件路径时仍有一些差异(例如,Windows 使用反斜杠,类Unix系统使用正斜杠)。

确保跨平台一致性

为了确保代码在不同平台上的一致性,您应该使用 os.path 模块中的适当函数和方法,如 os.path.join()os.path.normpath()os.path.normcase()

使用 os.path.normpath() 和 os.path.normcase()

os.path.normpath() 函数可以用于规范化路径,消除冗余分隔符和上级引用(例如 ../)。os.path.normcase() 函数可以用于规范化路径的大小写,在区分大小写的文件系统上非常重要。

import os
 
# 规范化路径
path = "/path/to/../file.txt"
normalized_path = os.path.normpath(path)
print(normalized_path)  # 输出: "/path/file.txt"
 
# 规范化路径的大小写
path = "/PATH/to/FILE.txt"
normalized_path = os.path.normcase(path)
print(normalized_path)  # 输出: "/path/to/file.txt"(在 类Unix系统 上)

通过使用这些函数,您可以确保文件路径在不同操作系统上保持一致的格式。

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

按名称、大小或修改时间对文件列表排序

您可以根据文件名、大小或修改时间等属性对文件列表进行排序。可以使用 sorted() 函数来实现此目的,以及适当的键函数。

import os
 
directory = "/path/to/directory"
files = os.listdir(directory)
 
# 按文件名排序
sorted_files = sorted(files)
print(sorted_files)
 
# 按文件大小排序
file_sizes = [(f, os.path.getsize(os.path.join(directory, f))) for f in files]
sorted_files = sorted(file_sizes, key=lambda x: x[1])
print(sorted_files)
 
# 按修改时间排序
file_mod_times = [(f, os.path.getmtime(os.path.join(directory, f))) for f in files]
sorted_files = sorted(file_mod_times, key=lambda x: x[1])
print(sorted_files)

这将分别输出按文件名、大小和修改时间排序的文件列表。

按扩展名或其他属性对文件进行分组

您可以使用字典或 defaultdict 按文件扩展名或其他属性对文件进行分组:

import os
from collections import defaultdict
 
directory = "/path/to/directory"
files = os.listdir(directory)
 
# 按扩展名分组文件
file_groups = defaultdict(list)
for file in files:
    extension = os.path.splitext(file)[1][1:]
    file_groups[extension].append(file)
 
for extension, files in file_groups.items():
    print(f"{extension}文件: {', '.join(files)}")
 
# 按大小(以MB为单位)分组文件
file_sizes = [(f, os.path.getsize(os.path.join(directory, f))) for f in files]
file_groups = defaultdict(list)
for file, size in file_sizes:
    size_mb = size / (1024 * 1024)
    file_groups[f"{size_mb:.2f} MB"].append(file)
 
for size, files in file_groups.items():
    print(f"{size}文件: {', '.join(files)}")

这将按扩展名或文件大小分组文件。

数据结构

列表

列表是 Python 中最常用的多功能数据结构之一。它们是有序的项目集合,可以包含不同的数据类型。下面是一个示例:

my_list = [1, 'apple', 3.14, True]

您可以使用索引访问列表中的单个元素,索引从 0 开始:

print(my_list[0])  # 输出: 1
print(my_list[2])  # 输出: 3.14

您还可以修改列表中的元素:

my_list[1] = 'banana'
print(my_list)  # 输出: [1, 'banana', 3.14, True]

列表有许多内置方法,例如 append()insert()remove()sort()

元组

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

```python
my_tuple = (1, 'apple', 3.14, True)
print(my_tuple[0])  # 输出: 1

当您希望确保数据集的顺序和内容保持不变时,元组非常有用。

字典

字典是无序的键值对集合。它们使用花括号 {} 定义,每个键值对之间用冒号 : 分隔。

my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}
print(my_dict['name'])  # 输出: 'John'

您可以向字典中添加、修改和删除键值对:

my_dict['email'] = 'john@example.com'
my_dict['age'] = 31
del my_dict['city']

字典对于基于唯一键存储和检索数据非常强大。

集合

集合是无序的唯一元素集合。它们使用花括号 {}set() 函数定义。

my_set = {1, 2, 3, 4, 5}
print(2 in my_set)  # 输出: True
print(6 in my_set)  # 输出: False

集合用于执行数据集之间的并集、交集和差集等操作非常有用。

控制流

条件语句

Python 中的条件语句使用关键字 ifelifelse 根据特定条件执行不同的代码块。

x = 10
if x > 0:
    print("x 是正数")
elif x < 0:
    print("x 是负数")
else:
    print("x 是零")

循环

Python 有两种主要的循环结构:forwhilefor 循环用于迭代序列(如列表、元组或字符串),而 while 循环用于在某个条件为真时执行一段代码块。

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

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

列表推导

列表推导提供了一种基于现有列表创建新列表的简洁方式。它们在转换或过滤数据时特别有用。

# 创建一个由 1 到 10 的数字平方组成的新列表
squares = [x**2 for x in range(1, 11)]
print(squares)  # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
 
# 创建一个由 1 到 10 的偶数组成的新列表
even_numbers = [x for x in range(1, 11) if x % 2 == 0]
print(even_numbers)  # 输出: [2, 4, 6, 8, 10]

函数

Python 中使用 def 关键字定义函数。它们可以接受参数并返回值。

def greet(name):
    """向给定名称的人打招呼。"""
    print(f"你好,{name}!")
 
greet("Alice")  # 输出: 你好,Alice!

您还可以使用默认参数值和可变长度参数定义函数。

def calculate_area(length, width=1):
    """计算矩形的面积。"""
    return length * width
 
print(calculate_area(5, 3))  # 输出: 15
print(calculate_area(4))  # 输出: 4(默认宽度为 1)
 
def sum_numbers(*args):
    """计算任意数量参数的总和。"""
    return sum(args)
 
print(sum_numbers(1, 2, 3))  # 输出: 6
print(sum_numbers(4, 5, 6, 7, 8))  # 输出: 30

函数还可以定义为 lambda 函数(匿名函数),用于简单的单行操作。

square = lambda x: x**2
print(square(5))  # 输出: 25

模块和包

Python 的标准库提供了广泛的内置模块,您可以在程序中使用这些模块。您还可以创建自己的模块和包来组织代码。

# 使用内置模块
import math
print(math.pi)  # 输出: 3.141592653589793
 
# 创建自定义模块
# my_module.py
def greet(name):
    print(f"你好,{name}!")
 
# 使用自定义模块
import my_module
my_module.greet("Alice")  # 输出: 你好,Alice!

包是模块的集合,它们可帮助您组织代码并管理依赖项。

异常处理

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

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误:除以零")
else:
    print(f"结果:{result}")
finally:
    print("该代码块将始终执行。")

您还可以定义自己的自定义异常,并在必要时引发它们。

class InvalidInputError(Exception):
    pass
 
def divide(a, b):
    if b == 0:
        raise InvalidInputError("错误:除以零")
    return a / b
 
try:
    print(divide(10, 0))
except InvalidInputError as e:
    print(e)

文件 I/O

Python 提供了内置函数来读取和写入文件。

# 写入文件
with open("output.txt", "w") as file:
    file.write("你好,世界!")
 
# 读取文件
with open("input.txt", "r") as file:
    content = file.read()
    print(content)

with 语句确保操作完成后文件被正确关闭。

结语

在这个 Python 教程中,我们涵盖了许多主题,包括数据结构、控制流、函数、模块和包、异常处理以及文件 I/O。通过理解这些概念,您将成为一个熟练的 Python 程序员。记得定期练习并探索 Python 库和框架的广泛生态系统,以扩展您的技能并构建强大的应用程序。

MoeNagy Dev