《Python编程快速上手——让繁琐工作自动化 第2版》
9.9.3 项目 正则表达式查找
编写一个程序,以打开文件夹中所有的.txt文件,并查找匹配用户提供的正则表达式的所有行。结果应该输出到屏幕上。
豆包AI回答
import os
import re
def find_matching_lines(folder_path, regex_pattern):
# 编译正则表达式
pattern = re.compile(regex_pattern)
# 遍历指定文件夹中的所有文件
for root, dirs, files in os.walk(folder_path):
for file in files:
# 检查文件是否为 .txt 文件
if file.endswith('.txt'):
file_path = os.path.join(root, file)
try:
# 打开文件并逐行读取
with open(file_path, 'r', encoding='utf-8') as f:
for line_number, line in enumerate(f, start=1):
# 检查当前行是否匹配正则表达式
if pattern.search(line):
print(f"File: {file_path}, Line {line_number}: {line.strip()}")
except Exception as e:
print(f"Error reading {file_path}: {e}")
if __name__ == "__main__":
# 获取用户输入的文件夹路径
folder_path = input("请输入要搜索的文件夹路径: ")
# 获取用户输入的正则表达式
regex_pattern = input("请输入要查找的正则表达式: ")
# 调用函数进行查找
find_matching_lines(folder_path, regex_pattern)
运行结果:
请输入要搜索的文件夹路径: .
请输入要查找的正则表达式: ^ZOO
File: .\dictionary.txt, Line 45322: ZOO
File: .\dictionary.txt, Line 45323: ZOOLOGICAL
File: .\dictionary.txt, Line 45324: ZOOLOGICALLY
File: .\dictionary.txt, Line 45325: ZOOM
File: .\dictionary.txt, Line 45326: ZOOMS
File: .\dictionary.txt, Line 45327: ZOOS
deepseek V3模型回答:
import os
import re
def search_in_files(folder_path, regex_pattern):
# 编译正则表达式
regex = re.compile(regex_pattern)
# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
if filename.endswith(".txt"):
file_path = os.path.join(folder_path, filename)
with open(file_path, 'r', encoding='utf-8') as file:
# 读取文件的每一行
for line_number, line in enumerate(file, start=1):
if regex.search(line):
# 输出匹配的行
print(f"File: {filename}, Line {line_number}: {line.strip()}")
if __name__ == "__main__":
# 用户输入文件夹路径和正则表达式
folder_path = input("请输入文件夹路径: ")
regex_pattern = input("请输入正则表达式: ")
# 调用函数进行搜索
search_in_files(folder_path, regex_pattern)
运行结果:
请输入文件夹路径: .
请输入正则表达式: ^ZOO
File: dictionary.txt, Line 45322: ZOO
File: dictionary.txt, Line 45323: ZOOLOGICAL
File: dictionary.txt, Line 45324: ZOOLOGICALLY
File: dictionary.txt, Line 45325: ZOOM
File: dictionary.txt, Line 45326: ZOOMS
File: dictionary.txt, Line 45327: ZOOS
总结:
本项目主要考察使用python进行文件操作,以及正则表达式的应用(逻辑比较固定,直接交给AI编写),从回答看,两个大模型给的代码都可以实现基本功能,但还是有少许差异:豆包AI的代码中有文件操作时的异常处理语句,代码更加健壮;deepseek V3给的代码在遍历文件时使用了os.listdir()方法(源码解释:Return a list containing the names of the files in the directory.返回一个包含该目录中文件名称的列表。),这块代码更加简洁。
对比os.walk()和os.listdir()方法查找txt文件
使用os.walk()
优点
递归遍历:os.walk() 会递归地遍历指定文件夹及其所有子文件夹,自动处理嵌套的文件夹结构,无需手动编写递归函数。因此,当需要查找整个文件夹树中的 .txt 文件时,使用 os.walk() 非常方便。
全面性:可以获取到每个子文件夹的路径(root)、子文件夹名称列表(dirs)和文件名称列表(files),提供了更丰富的信息,方便进行更复杂的操作。
缺点
性能开销大:由于需要递归遍历整个文件夹树,当文件夹结构复杂、文件数量较多时,会消耗较多的时间和系统资源,执行效率相对较低。
代码复杂度稍高:相比于 os.listdir(),os.walk() 的代码结构稍微复杂一些,需要理解 root、dirs 和 files 三个变量的含义和使用方法。
使用os.listdir()
优点
简单直接:代码逻辑简单,易于理解和实现。如果只需要处理指定文件夹下的文件,不涉及子文件夹,使用 os.listdir() 可以快速获取该文件夹内的所有文件和文件夹名称,然后筛选出 .txt 文件。
性能较高:由于只处理指定文件夹下的文件,不递归遍历子文件夹,所以在不需要处理子文件夹的情况下,执行速度相对较快,占用的系统资源也较少。
缺点
不支持递归:os.listdir() 只能列出指定文件夹下的直接子文件和子文件夹,无法递归遍历子文件夹中的文件。如果需要处理子文件夹中的 .txt 文件,就需要自己编写递归函数,增加了代码的复杂度。
对比总结
特性 | 方案一 (os.walk ) | 方案二 (os.listdir ) |
---|---|---|
遍历范围 | 当前文件夹及其所有子文件夹 | 仅当前文件夹 |
代码复杂度 | 稍复杂 | 简单 |
性能 | 较低(递归遍历) | 较高(单层遍历) |
适用场景 | 多层文件夹,结构复杂 | 单层文件夹,结构简单 |
选择建议
如果需要递归查找整个文件夹树中的 .txt 文件,方案一更合适,虽然性能开销大一些,但可以方便地处理嵌套的文件夹结构。
如果只需要处理指定文件夹下的 .txt 文件,不涉及子文件夹,建议使用方案二,因为它简单高效。