使用 Python 遍历文件夹

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

整体思路:

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

Python 实现步骤

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

步骤 1:遍历子目录

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

import os

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

在这个函数中,我们遍历了 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 spaces
            if cleaned_line:  # Ignore blank lines
                cleaned_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 files
    text_files = list_text_files(root_dir)
    # Step 2 and 3: Clean and merge the content
    cleaned_content = merge_cleaned_files(text_files)
    # Step 4: Write to the new file
    write_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
    /subdir1
        file1.txt
        file2.txt
    /subdir2
        file3.txt
        file4.txt

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

  • file1.txt

    Hello World
    
    This 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.mfbz.cn/a/887712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python 数据分析 可视化大屏 附源码 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

国外电商系统开发-运维系统拓扑布局

点击列表中设备字段,然后定位到【拓扑布局】中,可以看到拓扑发生了变化 再回头,您再次添加一个服务器到系统中,并且选择该服务器的连接节点为您刚才创建的“SDN路由器”,保存后,您可以看到这个服务器连接着…

RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)

目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…

小程序原生-利用setData()对不同类型的数据进行增删改

1. 声明和绑定数据 wxml文件 <view> {{school}} </view> <view>{{obj.name}}</view> <view id"{{id}}" > 绑定属性值 </view> <checkbox checked"{{isChecked}}"/> <!--算数运算--> <view>{{ id …

数理统计(第1章第2节:一些常用的抽样分布)

目录 统计量的概率分布称为“抽样分布” 1. 正态母体的子样平均数的抽样分布 正态分布 2. 卡方分布 3. t分布 4. F分布 5. 例题 6. 总结 统计量的概率分布称为“抽样分布” 1. 正态母体的子样平均数的抽样分布 正态分布 若随机变量X的概率密度为&#xff1a; 则称X服…

Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

继续讲一些Qt开发中的技巧操作&#xff1a; 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制&#xff0c;有时候不想看到这个烦人的切换按钮&#xff0c;可以设置usesScrollButtons为假&#xff0c;其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…

重学SpringBoot3-集成Redis(三)之注解缓存策略设置

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09;之注解缓存策略设置 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定…

Vue - 路由用法

前端路由就是URL中的hash与组件之间的对应关系。Vue Router是Vue的官方路由。 组成&#xff1a; VueRouter&#xff1a;路由器类&#xff0c;根据路由请求在路由视图中动态渲染选中的组件。<router-link>&#xff1a;请求链接组件&#xff0c;浏览器会解析成<a>。…

【易上手快捷开发新框架技术】nicegui组件button用法庖丁解牛深度解读源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 前言一、button 组件基本用法1. 最基本用法示例2. 创建带图标按钮 二、button按钮组件样式定制1. 按钮的尺寸调整2. 改变颜色示例3. 按钮的自定义字体大小4. 圆角形状示例5. 自定义边框6. 添加阴影7. 复合按钮8. 浮动按钮9. 可扩展浮动操作按钮QFAB10. 按…

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…

Bellman-Ford算法和SPFA算法

Bellman-Ford算法 能够处理存在负边权的情况。 算法时间复杂度:O(n*m)&#xff0c;n是顶点数&#xff0c;m是边数。 算法实现: 设s为起点&#xff0c;dis[v]即为s到v的最短距离&#xff0c;pre[v]为v前驱。w[j]是边j的长度&#xff0c;且j连接u、v。 dis[s] 0;dis[v] 0x3…

4款专业电脑数据恢复软件,帮你保障数据安全。

电脑里面会出现的数据丢失场景有很多&#xff0c;像硬盘故障、回收站清空、电脑格式化、系统崩溃、病毒入侵等等&#xff1b;如果发现数据丢失后&#xff0c;建议应停止使用电脑&#xff0c;避免新的数据写入覆盖丢失的数据。然后再尝试进行数据找回&#xff0c;如果想自己进行…

UGUI(六大UI根基组件)

Rect Transform 各种参数 是显示pos还是width/height 还是left/top/right/bottom之类巴拉巴拉&#xff0c;各种混合的展示baby&#xff0c;都是看anchor的设置 pivot的设置影响具体数值 至于blueprint mode &#xff0c;就是用了之后框框不变&#xff0c;who wanna do thi…

从WIFI到NB-IoT,探秘智能门锁的高科技接入方式

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello大家好!我是小米,一个29岁、活力满满、热爱分享技术的小米!今天,我想和大家聊聊一个与智能家居密切相关的技术话题——智能门锁的接入方式。无…

哪个编程工具让你的工作效率翻倍?

文章目录 哪个编程工具让你的工作效率翻倍&#xff1f;1. 编辑器与 IDE&#xff1a;高效编码的基础1.1 Visual Studio Code提升效率的关键功能&#xff1a; 1.2 JetBrains 系列 IDE提升效率的关键功能&#xff1a; 1.3 Vim提升效率的关键功能&#xff1a; 2. 版本控制工具&…

使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应&#xff1a;详细教程 在现代应用程序中&#xff0c;API调用是一个非常常见的任务。本文将通过一个完整的示例&#xff0c;讲解如何使用Java调用OpenAI的ChatGPT API&#xff0c;并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…

习题5 循环

选择题 1、如下程序的运行结果为 【 正确答案: B】。 A.9 B.8 C.7 D.6 2、C语言的for语句中的表达式可以部分或全部省略&#xff0c;但两个 【 正确答案: C】不能省略。 但当三个表达式均省略后&#xff0c;因缺少判断条件&#xff0…

翔云 OCR:发票识别与验真

在数字化时代&#xff0c;高效处理大量文档和数据成为企业和个人的迫切需求。翔云 OCR 作为一款强大的光学字符识别工具&#xff0c;在发票识别及验真方面表现出色&#xff0c;为我们带来了极大的便利。 一、翔云 OCR 简介 翔云 OCR 是一款基于先进的人工智能技术开发的文字识别…

第十一章 缓存之更新/穿透/雪崩/击穿

目录 一、什么是缓存 二、缓存更新策略 2.1. 缓存主动更新策略 2.1.1. Cache Aside模式&#xff08;主流&#xff09;‌ 2.1.2. Read/Write Through模式‌ 2.1‌.3. Write Behind模式‌ 2.1.4. 总结 三、缓存穿透 四、缓存雪崩 五、缓存击穿 5.1. 互斥锁实现 5.1.1…

【从0开始搭建微服务并进行部署】SpringBoot+dubbo+zookeeper

文章目录 说明环境搭建创建项目父模块设置子模块 dubbo-api子模块 dubbo-provider子模块 dubbo-consumer测试项目 docker部署项目完整项目地址 说明 jdk1.8SpringBoot2.x低版本dubbo&#xff1a;请查看之前教程【微服务】SpringBootDubboZooKeeper 实战 关于本教程将采用jdk1…