本文目录导读:

#!/usr/bin/env python3
"""
批量去除文本文件中的空行(包括仅含空白字符的行)
支持单个文件或文件夹批量处理
"""
import os
import sys
import argparse
def remove_empty_lines(text):
"""
去除文本中的空行和仅含空白字符的行
返回处理后的文本
"""
lines = text.splitlines()
# 过滤掉空行或仅含空白字符的行
non_empty_lines = [line for line in lines if line.strip()]
return '\n'.join(non_empty_lines)
def process_file(input_path, output_path=None, inplace=False):
"""
处理单个文件
:param input_path: 输入文件路径
:param output_path: 输出文件路径(None时覆盖原文件)
:param inplace: 是否直接修改原文件
"""
try:
with open(input_path, 'r', encoding='utf-8') as f:
content = f.read()
except UnicodeDecodeError:
# 若UTF-8解码失败,尝试使用系统默认编码
with open(input_path, 'r', encoding='latin-1') as f:
content = f.read()
except Exception as e:
print(f"读取文件失败 {input_path}: {e}")
return False
new_content = remove_empty_lines(content)
# 确定输出路径
if inplace:
output_path = input_path
elif output_path is None:
# 默认在原文件名后添加 _no_empty
base, ext = os.path.splitext(input_path)
output_path = f"{base}_no_empty{ext}"
try:
with open(output_path, 'w', encoding='utf-8') as f:
f.write(new_content)
print(f"处理完成: {input_path} -> {output_path}")
return True
except Exception as e:
print(f"写入文件失败 {output_path}: {e}")
return False
def process_directory(directory, pattern="*.txt", inplace=False):
"""
批量处理文件夹中所有匹配的文件
:param directory: 文件夹路径
:param pattern: 文件匹配模式,默认处理所有txt文件
:param inplace: 是否直接修改原文件
"""
import glob
# 支持简单的通配符匹配
search_path = os.path.join(directory, pattern)
files = glob.glob(search_path)
if not files:
print(f"在 {directory} 中未找到匹配 {pattern} 的文件")
return
print(f"找到 {len(files)} 个文件,开始处理...")
for file_path in files:
if os.path.isfile(file_path):
process_file(file_path, inplace=inplace)
def main():
parser = argparse.ArgumentParser(
description="批量去除文本文件中的空行(包括仅含空白字符的行)",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例用法:
# 处理单个文件,输出到新文件
python remove_empty_lines.py input.txt
# 处理单个文件,直接覆盖原文件
python remove_empty_lines.py input.txt --inplace
# 处理单个文件,指定输出路径
python remove_empty_lines.py input.txt -o output.txt
# 批量处理当前目录所有txt文件(覆盖原文件)
python remove_empty_lines.py . --pattern "*.txt" --inplace
# 批量处理指定目录所有log文件(输出到新文件)
python remove_empty_lines.py /path/to/logs --pattern "*.log"
"""
)
parser.add_argument(
"path",
help="文件路径或文件夹路径"
)
parser.add_argument(
"-o", "--output",
help="输出文件路径(仅单文件模式有效)"
)
parser.add_argument(
"--pattern",
default="*.txt",
help="批量处理时的文件匹配模式,默认 *.txt"
)
parser.add_argument(
"--inplace",
action="store_true",
help="直接修改原文件(不生成新文件)"
)
args = parser.parse_args()
if os.path.isfile(args.path):
# 单文件模式
process_file(args.path, args.output, inplace=args.inplace)
elif os.path.isdir(args.path):
# 目录模式 - 批量处理
if args.output and not args.inplace:
print("警告: 目录模式下 -o 参数将被忽略,使用 --inplace 或默认命名方式")
process_directory(args.path, args.pattern, inplace=args.inplace)
else:
print(f"错误: 路径不存在 {args.path}")
sys.exit(1)
if __name__ == "__main__":
main()
使用说明
- 保存脚本:将上述代码保存为
remove_empty_lines.py - 运行环境:需要 Python 3 环境
- 基本用法:
- 处理单个文件:
python remove_empty_lines.py 文件路径 - 处理单个文件并覆盖原文件:
python remove_empty_lines.py 文件路径 --inplace - 批量处理文件夹内所有txt文件:
python remove_empty_lines.py 文件夹路径
- 处理单个文件:
功能特点
- 去除所有空行(包括只包含空格、制表符等空白字符的行)
- 支持单个文件和文件夹批量处理
- 自动处理编码问题(优先UTF-8,失败时尝试latin-1)
- 默认生成新文件(在原文件名后添加
_no_empty),或选择直接覆盖原文件