python 检索一个目录下所有的txt文件,并把文件改为.log

本文介绍了一种使用Python批量修改目录及其子目录下特定文件后缀的方法,通过递归遍历目录,将所有txt文件的后缀更改为log,适用于需要大量文件格式转换的场景。

检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log:

import os
f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder'
def find_file(file_path, o_post, n_post, lis):
    ls = os.listdir(file_path)
    for i in ls:
        son_path = os.path.join(file_path,i)
        if os.path.isdir(son_path):
            find_file(son_path,o_post,n_post,lis)
        else:
            file_post = str(i.split('.')[-1])
            if file_post == o_post:
                lis.append(i)
                os.rename(son_path,str(son_path.split('.')[0])+'.'+n_post)
                print('找到文件{srcnam},已修改成:{dicname}'.format(srcnam=son_path,dicname=str(i.split('.')[0])+'.'+n_post))
    return lis
old_post = 'log'
new_post = 'txt'
print('已修改文件:',find_file(f_path, old_post, new_post, []))

运行结果:

C:\Users\shenping\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/PycharmProjects/mystudy/修改文件类型.py
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\f1\f5\f6\tt.txt,已修改成:tt.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\f1\f5\gg.txt,已修改成:gg.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\f1\fw1.txt,已修改成:fw1.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\f2\fw2.txt,已修改成:fw2.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\f4\fw4.txt,已修改成:fw4.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\w1.txt,已修改成:w1.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\w2.txt,已修改成:w2.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\w3.txt,已修改成:w3.log
找到文件C:\Users\PycharmProjects\mystudy\Testfolder\w4.txt,已修改成:w4.log
已修改文件: ['tt.txt', 'gg.txt', 'fw1.txt', 'fw2.txt', 'fw4.txt', 'w1.txt', 'w2.txt', 'w3.txt', 'w4.txt']

转载于:https://www.cnblogs.com/wolfshining/p/7735647.html

<think> 根据用户查询,需要检索指定目录下的所有.txt文件保存结果。结合引用内容,我们将: 1. 使用os模块或glob模块搜索文件 2. 提供两种方式:非递归(当前目录)和递归(包含子目录) 3. 将结果保存到指定文件中 我们将提供两种方法: 方法一:使用os模块(支持递归和非递归) 方法二:使用glob模块(更简洁) 同时,我们将展示如何将找到的文件列表保存到另一个文件中(如JSON或文本文件) </think> # Python检索目录下全部.txt文件保存的方法 在Python检索目录下所有.txt文件保存结果是一个常见任务,下面我将详细介绍三种高效的方法,展示如何保存结果到不同格式的文件中。 ## 一、基础检索方法 ### 1. 使用`os.listdir()`(非递归) ```python import os def find_txt_files(directory): """查找目录下所有.txt文件(不包含子目录)""" txt_files = [] for filename in os.listdir(directory): if filename.endswith('.txt'): # 获取文件的完整路径 file_path = os.path.join(directory, filename) txt_files.append(file_path) return txt_files # 使用示例 directory_path = '/path/to/your/directory' txt_files = find_txt_files(directory_path) # 保存结果到文本文件 with open('txt_file_list.txt', 'w', encoding='utf-8') as f: for file in txt_files: f.write(file + '\n') ``` ### 2. 使用`os.walk()`(递归搜索) ```python import os def find_txt_files_recursive(directory): """递归查找目录及子目录下所有.txt文件""" txt_files = [] for root, dirs, files in os.walk(directory): for filename in files: if filename.endswith('.txt'): # 获取文件的完整路径 file_path = os.path.join(root, filename) txt_files.append(file_path) return txt_files # 使用示例 directory_path = '/path/to/your/directory' txt_files = find_txt_files_recursive(directory_path) # 保存结果到CSV文件 import csv with open('txt_files.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(['文件路径', '文件大小(B)']) for file in txt_files: size = os.path.getsize(file) writer.writerow([file, size]) ``` ## 二、进阶检索方法 ### 3. 使用`glob`模块(推荐) ```python import glob import os def find_txt_with_glob(directory, recursive=True): """ 使用glob模块查找.txt文件 :param directory: 目标目录 :param recursive: 是否递归搜索子目录 :return: .txt文件路径列表 """ # 构建搜索模式 pattern = '**/*.txt' if recursive else '*.txt' # 执行搜索(recursive参数需要Python 3.5+) search_path = os.path.join(directory, pattern) return glob.glob(search_path, recursive=recursive) # 使用示例 directory_path = '/path/to/your/directory' txt_files = find_txt_with_glob(directory_path, recursive=True) # 保存结果到JSON文件 import json with open('txt_files.json', 'w', encoding='utf-8') as f: # 添加文件元数据 file_data = { 'directory': directory_path, 'count': len(txt_files), 'files': [{ 'path': file, 'size': os.path.getsize(file), 'modified': os.path.getmtime(file) } for file in txt_files] } json.dump(file_data, f, ensure_ascii=False, indent=2) ``` ## 三、保存结果的多种方式 ### 1. 简单文本格式 ```python def save_to_text(file_list, output_path): """保存文件列表到文本文件""" with open(output_path, 'w', encoding='utf-8') as f: f.write(f"共找到 {len(file_list)} 个.txt文件:\n\n") for file in file_list: f.write(f"{file}\n") ``` ### 2. CSV格式(含文件属性) ```python import csv import os from datetime import datetime def save_to_csv(file_list, output_path): """保存文件列表到CSV,包含文件属性""" with open(output_path, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(['文件路径', '文件大小(B)', '最后修改时间']) for file in file_list: size = os.path.getsize(file) modified = datetime.fromtimestamp(os.path.getmtime(file)) writer.writerow([file, size, modified.strftime('%Y-%m-%d %H:%M:%S')]) ``` ### 3. JSON格式(结构化数据) ```python import json import os def save_to_json(file_list, output_path): """保存文件列表到JSON格式""" file_data = [] for file in file_list: file_data.append({ 'path': file, 'size': os.path.getsize(file), 'is_file': os.path.isfile(file), 'directory': os.path.dirname(file) }) with open(output_path, 'w', encoding='utf-8') as f: json.dump({ 'total_files': len(file_data), 'files': file_data }, f, ensure_ascii=False, indent=2) ``` ## 四、完整示例脚本 ```python import os import glob import json from datetime import datetime def find_txt_files(directory, recursive=True): """查找目录下所有.txt文件""" pattern = '**/*.txt' if recursive else '*.txt' return glob.glob(os.path.join(directory, pattern), recursive=recursive) def save_results(files, output_format='json', output_path='txt_files_result'): """根据指定格式保存结果""" if output_format == 'json': save_path = f"{output_path}.json" save_to_json(files, save_path) elif output_format == 'csv': save_path = f"{output_path}.csv" save_to_csv(files, save_path) else: # 默认文本格式 save_path = f"{output_path}.txt" save_to_text(files, save_path) return save_path def save_to_json(file_list, output_path): """保存为JSON格式""" file_data = [{ 'path': file, 'size': os.path.getsize(file), 'modified': os.path.getmtime(file) } for file in file_list] with open(output_path, 'w', encoding='utf-8') as f: json.dump({ 'search_time': datetime.now().isoformat(), 'total_files': len(file_list), 'files': file_data }, f, ensure_ascii=False, indent=2) # 使用示例 if __name__ == "__main__": target_dir = input("请输入要搜索的目录路径: ") recursive = input("是否搜索子目录? (y/n): ").lower() == 'y' format_choice = input("选择输出格式 (json/csv/text): ").lower() txt_files = find_txt_files(target_dir, recursive) result_path = save_results(txt_files, format_choice) print(f"\n找到 {len(txt_files)} 个.txt文件") print(f"结果已保存到: {result_path}") ``` ## 五、方法比较 | 方法 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | os.listdir() | 简单直观,兼容性好 | 不能递归搜索子目录 | 单层目录检索 | | os.walk() | 支持递归搜索,功能全面 | 代码相对复杂,性能一般 | 需要搜索嵌套目录 | | glob.glob() | 代码简洁,模式匹配灵活 | 需要Python 3.5+支持递归 | 大多数场景首选 | ## 六、实际应用技巧 1. **过滤特定大小的文件**: ```python # 只保留大于1KB的文件 large_files = [f for f in txt_files if os.path.getsize(f) > 1024] ``` 2. **按修改时间筛选**: ```python from datetime import datetime, timedelta # 查找最近7天修改的文件 recent_files = [f for f in txt_files if datetime.now() - datetime.fromtimestamp(os.path.getmtime(f)) < timedelta(days=7)] ``` 3. **行处理加速搜索**(适用于超大型目录): ```python from concurrent.futures import ThreadPoolExecutor def search_directory(dir_path): return [os.path.join(dir_path, f) for f in os.listdir(dir_path) if f.endswith('.txt')] with ThreadPoolExecutor() as executor: results = list(executor.map(search_directory, subdirectories)) ``` 4. **日志记录**: ```python import logging logging.basicConfig(filename='file_search.log', level=logging.INFO) logging.info(f"开始搜索目录: {directory_path}") # ...搜索代码... logging.info(f"找到 {len(txt_files)} 个.txt文件") ``` Python提供的多种文件搜索方法各有优势,`glob`模块因其简洁性和灵活性成为大多数场景的首选[^2]。实际应用中,建议结合具体需求选择合适的方法,根据需要添加文件属性信息丰富输出结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值