如何使用Python读取子目录下所有txt并删除空行和空格?

发布时间:
2024-10-14 23:47
阅读量:
17

谢邀!这个问题其实不复杂,但细节挺多,稍不注意就会踩坑。像这种场景,我猜你肯定是手头有一堆杂乱无章的txt文件,有的子目录下还特么嵌套了好几层,搞得你一脸懵逼。不过放心,咱们一步步搞定它。

首先得有个清晰的思路。我们需要先遍历所有的子目录,把所有的txt文件都找到。对于这种情况,推荐使用递归遍历,`os.walk()`是个好选择。接着就是处理文件内容。注意,有些txt文件可能编码不统一,搞不好就读不出来,得用`chardet`库探测一下编码格式。这个库得先安装,`pip install chardet`,这样读文件时不至于乱码。探测编码后,咱们就能按正确的格式打开文件。

文件读出来后,就要去掉里面的无效行。判断每一行是否只包含空格或者是完全空白的行,如果是就跳过,只保留有内容的部分。处理完这些杂乱的数据,再将所有清理干净的内容合并到一个新的txt文件中。这里记得用追加模式,`'a'`,避免每次写入都把前面的内容覆盖掉。

下面是实现这个功能的完整代码。我们先用`detect_encoding()`函数探测每个txt文件的编码格式,再用`read_and_clean_txt()`读取并清理内容。最后,通过`merge_txt_files()`来处理整个目录结构并将所有内容归并到一个新文件中。

import os import chardet def detect_encoding(file_path): """检测文件编码格式""" with open(file_path, 'rb') as f: result = chardet.detect(f.read()) return result['encoding'] def read_and_clean_txt(file_path): """读取txt文件,去掉空行和空白行""" encoding = detect_encoding(file_path) content = [] try: with open(file_path, 'r', encoding=encoding) as f: for line in f: clean_line = line.strip() # 去除首尾空格 if clean_line: # 过滤掉空行 content.append(clean_line) except Exception as e: print(f"文件读取失败:{file_path},原因:{e}") return content def merge_txt_files(directory, output_file): """合并目录下所有子目录中的txt文件,输出到一个新的文件中""" with open(output_file, 'w', encoding='utf-8') as outfile: for root, _, files in os.walk(directory): for file in files: if file.endswith('.txt'): # 筛选出所有txt文件 file_path = os.path.join(root, file) print(f"处理文件:{file_path}") cleaned_content = read_and_clean_txt(file_path) if cleaned_content: outfile.write("\n".join(cleaned_content) + "\n") print(f"所有txt文件已合并到:{output_file}") # 调用合并函数 directory_path = './你的目录路径' # 这儿换成你实际的目录路径 output_file_path = './合并后的文件.txt' # 输出文件路径 merge_txt_files(directory_path, output_file_path)

这段代码首先会用`chardet`探测每个txt文件的编码格式,确保能正确地读取内容。`read_and_clean_txt()`会用探测到的编码格式去打开文件,然后逐行处理,过滤掉所有的空行和只包含空格的行,最后返回一个干净的文本列表。接下来是`merge_txt_files()`这个主函数,它会递归遍历指定目录下的所有子目录,找到每个txt文件,并用前面写好的函数进行内容处理。所有处理过的内容最终都会写入到指定的总文件中。

在实际使用中可能会遇到一些小问题,比如有些txt文件的编码探测不准,导致读文件时还是出错。如果遇到这种情况,可以直接在`except`里用`encoding='utf-8'`或者`encoding='gbk'`来兜底,基本上就能解决大部分问题。

总结一下,这段代码大体能搞定你的需求,整体逻辑是先探测编码再读文件,再过滤空行,最后合并到一个新的文件中。记得实际操作时换成你自己的目录路径就行。搞定后,你就能轻松地把各种乱七八糟的txt文件合并成一个干净的txt了。

最后,分享一个不错的编程导航网站,里面有大量的免费教程供你学习:

j301.cn/python.html

END