使用 Python 遍历文件夹

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

整体思路:

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

Python 实现步骤

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

步骤 1:遍历子目录

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

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() 函数来处理每一行,并且过滤掉空行。示例代码如下:

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() 函数获取每个文件的内容,并将这些内容追加到一个大列表中。

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() 函数来完成这个操作。

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 脚本:

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.mzph.cn/web/54469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2694 标注数量(xml文件个数):2694 标注数量(txt文件个数):2694 标注…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念,不涉及具体的操作原理,旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期,计算机主机非常昂贵,而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

关于CSS 案例_新闻内容展示

新闻要求 标题:居中加粗发布日期: 右对齐分割线: 提示, 可以使用 hr 标签正文/段落: 左侧缩进插图: 居中显示 展示效果 审核过不了&#xff0c;内容没填大家将就着看吧。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中&#xff0c;placeholder 和 shape 是两个核心概念。虽然它们看起来相似&#xff0c;但在功能和作用上存在显著的区别。为了更好地理解这两个概念&#xff0c;我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…

C语言:预编译过程的剖析

目录 一.预定义符号和#define定义常量 二.#define定义宏 三.宏和函数的对比 四、#和##运算符 五、条件编译 在之前&#xff0c;我们已经介绍了.c文件在运行的过程图解&#xff0c;大的方面要经过两个方面。 一、翻译环境 1.预处理&#xff08;预编译&#xff09; 2.编译 3…

【网络安全】Cookie与ID未强绑定导致账户接管

未经许可,不得转载。 文章目录 前言正文前言 DigiLocker 是一项在线服务,旨在为公民提供一个安全的数字平台,用于存储和访问重要的文档,如 Aadhaar 卡、PAN 卡和成绩单等。DigiLocker 通过多因素身份验证(MFA)来保护用户账户安全,通常包括 6 位数的安全 PIN 和一次性密…

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接&#xff1a; https://automaticaddison.com/how-to-s…

Redis --- 第二讲 --- 特性和安装

一、背景知识 Redis特性&#xff1a; Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;作为缓存&#xff0c;在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据&#xff0c;通过一系列的数据结构。MySQL主要是通…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索&#xff1a;docker search 比如&#xff1a;docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像&#xff0c;如果有就是官方镜像&#xff0c;如果没有就是第三方的。 下载&#xff1a;docker pull 比如&#xff1a…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

Redis:list类型

Redis&#xff1a;list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构&#xff0c;Redis也做出了相应的支持。 如图&#xff…

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

基于SpringBoot+Vue的网约车管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…