使用 Python 遍历文件夹

devtools/2024/12/22 16:13:04/

要解决这个问题,使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树,找到所有的 text 文件,读取内容,处理空行和空格,并将处理后的内容合并到一个新的文件中。

整体思路:

  1. 遍历子目录:我们可以使用 os 模块来遍历目录中的所有文件。os.walk 是一个常用的方法,它可以递归遍历指定目录中的所有文件和子目录。
  2. 读取文件并处理内容:对于每个 .txt 文件,我们读取文件内容,删除空行和空格。可以使用字符串的 strip() 方法去除行首和行尾的空格,并且过滤掉空行。
  3. 合并文件内容:处理完每个文件的内容后,我们将所有内容合并成一个字符串,准备写入到新的文件中。
  4. 写入新的文件:最后,将合并后的内容写入到一个新的文本文件中。

Python 实现步骤

我们可以从文件遍历开始。先确保能够遍历子目录,然后一步步地实现每个细节。

步骤 1:遍历子目录

在 Python 中,os.walk 是一个非常强大的函数,可以递归遍历指定目录下的所有子目录和文件。它返回的是一个生成器,生成的是三元组 (dirpath, dirnames, filenames),即当前路径、当前路径下的目录列表和当前路径下的文件列表。

python">import osdef list_text_files(root_dir):text_files = []for dirpath, dirnames, filenames in os.walk(root_dir):for file in filenames:if file.endswith(".txt"):text_files.append(os.path.join(dirpath, file))return text_files

在这个函数中,我们遍历了 root_dir 目录下的所有子目录及其文件,并将所有 .txt 文件的路径添加到 text_files 列表中。

步骤 2:读取文件并删除空行和空格

为了从文件中删除空行和空格,我们可以使用 strip() 函数来处理每一行,并且过滤掉空行。示例代码如下:

python">def clean_text_file(file_path):cleaned_lines = []with open(file_path, 'r', encoding='utf-8') as file:for line in file:cleaned_line = line.strip()  # 删除行首尾的空格if cleaned_line:  # 过滤空行cleaned_lines.append(cleaned_line)return cleaned_lines

在这个函数中,我们打开每个 .txt 文件,逐行读取它的内容。通过 strip() 函数,我们删除了每一行的首尾空格。之后,我们过滤掉空行,只保留有内容的行。

步骤 3:合并所有文件的内容

接下来,我们要把所有清理过的文件内容合并在一起。我们可以通过调用 clean_text_file() 函数获取每个文件的内容,并将这些内容追加到一个大列表中。

python">def merge_cleaned_files(file_paths):all_cleaned_lines = []for file_path in file_paths:cleaned_lines = clean_text_file(file_path)all_cleaned_lines.extend(cleaned_lines)return all_cleaned_lines

在这个函数中,我们遍历所有的文件路径,使用 clean_text_file() 函数清理每个文件的内容,然后将所有清理后的内容合并到 all_cleaned_lines 列表中。

步骤 4:写入新文件

合并后的所有内容需要写入到一个新的 .txt 文件中。我们可以使用 Python 的 open() 函数来完成这个操作。

python">def write_to_new_file(new_file_path, cleaned_content):with open(new_file_path, 'w', encoding='utf-8') as new_file:for line in cleaned_content:new_file.write(line + '\n')

在这个函数中,我们打开一个新的文件,并将所有清理后的内容逐行写入文件。为了确保每行内容之间有换行符,我们在每一行后面添加了 \n

完整的实现代码

将上述步骤整合在一起,形成完整的 Python 脚本:

python">import os# Step 1: List all text files in the directory and its subdirectories
def list_text_files(root_dir):text_files = []for dirpath, dirnames, filenames in os.walk(root_dir):for file in filenames:if file.endswith(".txt"):text_files.append(os.path.join(dirpath, file))return text_files# Step 2: Clean text files by removing blank lines and extra spaces
def clean_text_file(file_path):cleaned_lines = []with open(file_path, 'r', encoding='utf-8') as file:for line in file:cleaned_line = line.strip()  # Remove leading and trailing spacesif cleaned_line:  # Ignore blank linescleaned_lines.append(cleaned_line)return cleaned_lines# Step 3: Merge the cleaned content of all files
def merge_cleaned_files(file_paths):all_cleaned_lines = []for file_path in file_paths:cleaned_lines = clean_text_file(file_path)all_cleaned_lines.extend(cleaned_lines)return all_cleaned_lines# Step 4: Write merged content to a new file
def write_to_new_file(new_file_path, cleaned_content):with open(new_file_path, 'w', encoding='utf-8') as new_file:for line in cleaned_content:new_file.write(line + '\n')# Main function to orchestrate the process
def process_text_files(root_dir, new_file_path):# Step 1: Get all text filestext_files = list_text_files(root_dir)# Step 2 and 3: Clean and merge the contentcleaned_content = merge_cleaned_files(text_files)# Step 4: Write to the new filewrite_to_new_file(new_file_path, cleaned_content)# Example usage:
root_directory = '/path/to/your/directory'
output_file = '/path/to/your/output_file.txt'
process_text_files(root_directory, output_file)

代码的解释

  1. list_text_files 函数:它遍历了目录及其子目录,找到了所有以 .txt 结尾的文件。文件的完整路径被保存在 text_files 列表中,便于后续处理。
  2. clean_text_file 函数:它读取给定文件的每一行,使用 strip() 函数清除行首尾的空格。之后,通过判断 cleaned_line 是否为空来过滤掉空行。如果这行有内容,就将它添加到 cleaned_lines 列表中。
  3. merge_cleaned_files 函数:它合并所有文件的内容。我们遍历每个文件路径,调用 clean_text_file 来获取每个文件的清理内容,然后将这些内容合并到一个大列表中。
  4. write_to_new_file 函数:它将合并后的内容写入到一个新的文件中。逐行写入时,通过 line + '\n' 来确保每一行都带有换行符。

示例说明

假设有如下目录结构:

/example_directory/subdir1file1.txtfile2.txt/subdir2file3.txtfile4.txt

每个 .txt 文件可能包含以下内容:

  • file1.txt

    Hello WorldThis is a test.
  • file2.txt

    Python is fun!
  • file3.txt

    
    The quick brown fox.

处理后,每个文件的内容会删除空行和空格,结果将合并为:

Hello World
This is a test.
Python is fun!
The quick brown fox.

最后,所有处理后的内容会被写入到一个新的文件中。新的文件将包含所有 .txt 文件中非空行的内容,且所有行首尾的空格已经被去掉。

关于性能优化

如果处理的文件非常多或非常大,可能会涉及一些性能优化的需求。比如,逐步处理文件而不是一次性读取所有文件的内容,可以避免过大的内存占用。以下是一些可能的优化方向:

  1. 逐步写入输出文件:可以在处理每个文件时,直接将清理后的内容写入新的文件,而不是等所有文件都处理完再写入。这样可以避免在内存中存储过多的数据。
  2. 多线程处理:在 Python 中使用多线程或多进程模块(如 threadingmultiprocessing)来同时处理多个文件,可以提升处理速度。
  3. 生成器:使用生成器处理文件可以更高效地利用内存,特别是在文件内容非常大的情况下。

总结

通过使用 Python 的标准库 os 和字符串处理功能,我们可以轻松实现读取子目录下所有

.txt 文件,并删除空行和空格,将处理后的内容合并到一个新的文件中。这个方法是高效且易扩展的,适用于各种目录结构和文件规模。


http://www.ppmy.cn/devtools/122280.html

相关文章

Stream流的终结方法(二)——collect

1.Stream流的终结方法 2. collect方法 collect方法用于收集流中的数据放到集合中去,可以将流中的数据放到List,Set,Map集合中 2.1 将流中的数据收集到List集合中 package com.njau.d10_my_stream;import java.util.*; import java.util.f…

深度学习中的结构化概率模型 - 推断和近似推断篇

序言 在深度学习的广阔领域中,结构化概率模型占据了举足轻重的地位。这类模型不仅捕捉了数据间的复杂关联与依赖性,还通过概率图的形式直观地表达了这些关系,为处理复杂数据提供了强大的框架。推断,作为结构化概率模型中的核心任…

Elasticsearch基础_4.ES搜索功能

文章目录 一、搜索辅助功能1.1、指定返回的字段1.2、结果计数1.3、结果分页 二、搜索匹配功能2.1、查询所有文档2.2、term级别查询2.2.1、term查询2.2.2、terms查询2.2.3、range查询2.2.4、exists查询 2.3、布尔查询2.3.1、must,should,must_not2.3.2、f…

测试管理新增视图与高级搜索功能,测试计划支持一键生成缺陷详情,MeterSphere开源持续测试工具v3.3版本发布

2024年9月29日,MeterSphere开源持续测试工具正式发布v3.3版本。 在这一版本中,接口测试方面,接口导入功能支持导入Postman、JMX、HAR和MeterSphere格式的文件,接口场景的自定义请求步骤支持cURL快捷导入;测试管理方面…

深入理解JavaScript 的原型继承

JavaScript 的原型链继承机制和 Java 的类继承机制有明显的区别,虽然它们都用于实现对象之间的继承,但它们的实现方式、概念以及运行机制都不同。 1. JavaScript 的原型继承 JavaScript 是基于原型链的继承,主要依赖对象的 __proto__ 属性或…

Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现(针对上一篇sku) 1、效果展示2、数据库设计3、后端源码3.1 application.yml 方便 AliOssUtil.java 读取3.2 model 层3.2.1 BaseEntity3.2.1 GoodsType3.2.3 GoodsTypeSonVo3.3 Controll…

C# 泛型使用案例_C# 泛型使用整理

一、系统自带常用的泛型 1.字典&#xff0c;集合 //字典 Dictionary<string, int> dic new Dictionary<string, int>(); //泛型集合 List<int> list new List<int>(); 2.泛型委托&#xff0c;输入参数&#xff0c;输出参数 //泛型 委托---输出参…

如何快速切换电脑的ip地址

在当今的数字化时代&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其重要性日益凸显。无论是出于保护个人隐私的需要&#xff0c;还是为了访问特定的网络服务等&#xff0c;快速切换电脑的IP地址已成为许多用户的迫切需求。本文将为你介绍几种实用的方法&#xff0c;帮…