使用 Python 遍历文件夹

news2024/11/27 18:44:17

要解决这个问题,使用 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.coloradmin.cn/o/2192609.html

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

相关文章

三维模型点云化工具V1.0使用介绍:将三维模型进行点云化生成

三维软件绘制的三维模型导入之后,可以生成点云,用于替代实际的激光扫描过程,当然,主要是用于点云算法的测试和验证,没法真正模拟扫描的效果,因为太过于理想化了。 功能介绍 将三维软件绘制的三维模型变成…

一个月学会Java 第3天 对类的深刻认识

Day3 对类的深刻认识 第一章 方法 在Day2的时候已经浅浅的认识过类,但是还是不够深刻,我们现在来深刻的认识一下类是什么和他的结构,首先在认识类的结构之前我们需要再认识和了解这么一个东西,他就是——方法 方法(method)也叫函…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代,管理和备份手机数据变得越来越重要。无论是转移照片、备份短信,还是管理应用程序,一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件,已经成为许多用户的选择。但是,许多…

用manim实现Gram-Schmidt正交化过程

在线性代数中,正交基有许多美丽的性质。例如,由正交列向量组成的矩阵(又称正交矩阵)可以通过矩阵的转置很容易地进行反转。此外,例如:在由彼此正交的向量张成的子空间上投影向量也更容易。Gram-Schmidt过程是一个重要的算法&#…

GESP C++三级样题卷

(满分:100 分 考试时间:90 分钟) 一、单选题(每题 2 分,共 30 分) 1.下列关于负数的原码、反码、补码的描述中,正确的是( ) A 原码和反码互为按位取反(符号位除外&…

[ComfyUI]Flux:太强了!任意扩图神器,小红书极致逼真风格出游打卡写实风

随着人工智能技术的不断发展,图像生成与反推技术已经成为了AI领域的一大热点。今天,我们就来为大家详细介绍一款由ComfyUI团队开发的超强图像反推工具——Flux,以及如何使用它实现任意扩图和极致逼真风格出游打卡写实风。 一、Flux&#xff…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先,需要准备三个服务器实例,这里我使用了阿里云创建了三个实例,如果不想花钱,也可以在VM上创…

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

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

好用且不伤眼镜的超声波清洗机排名!谁才是清洁小能手?

对于经常佩戴眼镜的人来说,眼镜的日常清洁保养极为关键。传统清洁方式可能导致镜片刮花和残留污渍,鉴于此,眼镜专用的超声波清洗机应运而生,利用超声振动技术深入微细缝隙,彻底扫除污垢与油脂,保护镜片免受…

计算机编程入门先学什么最好?零基础入门到精通,收藏这篇就够了

看完其他知友的回答,我认为他们的观点过于局限,并没有真正切中问题的要害。 我们不妨换个角度,站在更高一层来看这个问题「计算机编程入门先学什么最好?」 计算机入门最应该学的是 Linux,而非任何的编程语言。 这篇文…

A_H_README_TO_RECOVER勒索恢复---惜分飞

有客户mysql数据库被黑(业务数据库被删除),创建了一个A_H_README_TO_RECOVER库 [rootwww.xifenfei.com ~]# mysql -uroot -pxxxxx Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; …

站岗放哨树形dp

前言&#xff1a;好久没有写树上dp了&#xff0c;这儿题目还是挺有意思的 题目地址 #include<bits/stdc.h> #include<iostream> using namespace std;//#define int long long int n; const int N (int)1e510; int e[N],ne[N],h[N],idx 0; int dp[2][N];void add…

【笔记】神领物流Day1.1.20权限管家

传智权限管家是一个通用的权限管理中台服务&#xff0c;在神领物流项目中&#xff0c;我们使用权限系统管理企业内部员工&#xff0c;比如&#xff1a;快递员、司机、管理员等。 在权限管家中可以管理用户&#xff0c;管理后台系统的菜单&#xff0c;以及角色的管理。 权限管家…

【百度文心智能体】想开发爆款智能体?来看看 万圣节之夜探秘者 智能体开发流程大揭秘

目录 前言 一. 创作灵感 二. 智能体中Prompt如何设计 2.1 头像 && 聊天背景 2.2 智能体简介 && 角色定位与目标 2.3 思考路径 && 个性化 2.4 开场白 && 自动追问 2.5 插件选择 三. 总结 前言 从2022年11月底ChatGPT …

JavaEE: 数据链路层的奇妙世界

文章目录 数据链路层以太网源地址和目的地址 类型数据认识 MTU 数据链路层 以太网 以太网的帧格式如下所示: 源地址和目的地址 源地址和目的地址是指网卡的硬件地址(也叫MAC地址). mac 地址和 IP 地址的区别: mac 地址使用6个字节表示,IP 地址4个字节表示. 一般一个网卡,在…

论文选题没思路?用这7个GPT提示词10分钟确定论文选题

选题是论文写作的第一步&#xff0c;也是至关重要的一步。毕业论文选题都是让大学生头疼的大事。没有灵感、方向不清、信息太多&#xff0c;常常让人无从下手。现在有了ChatGPT这样的AI写作辅助工具&#xff0c;它可以帮你快速生成丰富的选题思路&#xff0c;轻松解决选题难题。…

Anaconda创建环境

目录 前言 第一步&#xff1a;更改环境创建位置 第二步&#xff1a;安装环境 前言 在我们创建多个项目的时候&#xff0c;有时会安装的库版本冲突&#xff0c;所以最好是一个项目一个环境 第一步&#xff1a;更改环境创建位置 新安装Anaconda后&#xff0c;在创建环境时环…

洛谷每日一题(P1205 [USACO1.2] 方块转换 Transformations)矩阵变换

原题目链接&#xff1a; P1205 [USACO1.2] 方块转换 Transformations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 原题目截图&#xff1a; 思路分析&#xff1a; 这题目还是比较简单&#xff0c;模拟一下旋转变化的过程&#xff0c;然后注意变换的规律就行了。 读取输入…

电脑提示msvcp140.dll丢失如何解决,马上教你6种解决方法

在使用电脑时&#xff0c;我们可能会遇到提示缺少msvcp140.dll的错误信息。这个提示意味着我们的电脑中缺少MSVCP140.dll这个文件&#xff0c;它是某些程序运行所必需的。如果我们遇到这个问题&#xff0c;应该如何解决呢&#xff1f;本文将详细解析如何解决msvcp140.dll丢失的…

C. Tree Pruning【Codeforces Round 975 (Div. 1)】

C. Tree Pruning (永远不知道为什么TLE直到把初始化的memset换成for循环 题意很简单&#xff0c;就是找到一个深度&#xff0c;使得删除最少的节点且所有的叶子节点都为这个深度。 从小到大遍历可能的深度i&#xff0c;容易知道所有 深度大于i的节点 和所有 子树最大深度小于i…