如何分割大压缩文本文件为小文本文件?求可行脚本/工具
处理大体积xz压缩语料分割的可行方案
一、使用系统命令行工具(高效首选)
直接结合xzcat和split命令,无需提前解压整个大文件,节省磁盘空间且运行速度更快:
按行数分割(每个文件10万行)
xzcat hu.txt.xz | split -l 100000 -d --additional-suffix=".txt" - hu_part_
参数说明:
-l 100000:每个输出文件固定包含100000行-d:用数字作为文件后缀(如hu_part_00、hu_part_01)--additional-suffix=".txt":给输出文件添加.txt后缀-:指定从标准输入读取数据hu_part_:输出文件的前缀名称
按大小分割(每个文件小于1GB)
xzcat hu.txt.xz | split -b 950M -d --additional-suffix=".txt" - hu_part_
参数说明:
-b 950M:限制每个文件最大为950MB(留余量避免超过1GB)- 其余参数含义与按行数分割一致
二、优化后的Python脚本
避免一次性加载整个文件到内存,采用逐行读取、分批写入的方式,同时直接处理xz压缩文件,内存占用极低:
import lzma def split_xz_file(input_path, lines_per_file=100000, max_size_mb=950): max_size = max_size_mb * 1024 * 1024 file_counter = 0 current_line_count = 0 current_size = 0 output_file = None try: # 直接读取xz压缩文件,无需提前解压 with lzma.open(input_path, 'rt', encoding='utf-8') as infile: for line in infile: if not output_file: output_filename = f"hu_part_{file_counter:02d}.txt" output_file = open(output_filename, 'w', encoding='utf-8') print(f"生成文件:{output_filename}") output_file.write(line) current_line_count += 1 current_size += len(line.encode('utf-8')) # 满足行数或大小任一条件则切换新文件 if current_line_count >= lines_per_file or current_size >= max_size: output_file.close() file_counter += 1 current_line_count = 0 current_size = 0 output_file = None # 关闭最后一个未完成的文件 if output_file: output_file.close() print(f"生成文件:hu_part_{file_counter:02d}.txt") except Exception as e: print(f"错误信息:{str(e)}") if output_file: output_file.close() if __name__ == "__main__": # 优先满足行数限制,其次触发大小限制,可按需调整参数 split_xz_file("hu.txt.xz", lines_per_file=100000, max_size_mb=950)
脚本说明:
- 依赖Python内置的
lzma模块,无需额外安装 - 逐行处理数据,内存占用稳定在较低水平
- 同时监控文件行数和大小,任一条件达标就自动生成新文件
- 输出文件命名规则清晰,便于后续批量处理
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

