本文目录导读:

#!/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),或选择直接覆盖原文件
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播