python3 分割文件,将大文件按行分割成最大某M的小文件 第一次运行自动生成配置文件第二次运行自动读取配置文件ai优化import os, json, platform from uuid import uuid1 from u_工具 import 配置, 打点, 计时, 序号, 序号_重置 print(———— 开始 ————) 打点() # region 1.用来配置的变量 config { 输入目录: ./a_输入, 输出目录: ./b_输出, 小文件大小: 1500 # 单位 M } config_filePath ./配置文件2.json 关联表 { 输入目录: 输入目录, 输出目录: 输出目录, 小文件大小: 小文件大小, } if os.path.exists(config_filePath): 配置.加载(config_filePath).关联(config, 关联表).重载() else: # 修复正确创建配置文件所在目录 配置目录 os.path.dirname(config_filePath) if 配置目录 and not os.path.exists(配置目录): os.makedirs(配置目录) with open(config_filePath, w, encodingutf-8) as f: json.dump(config, f, ensure_asciiFalse, indent2) # endregion # region 2.预处理 # 调整小文件大小 扩充到字节 config[小文件大小] int(config[小文件大小]) * 1024 * 1024 # 目录不存在就手动建立 if not os.path.exists(config[输出目录]): os.makedirs(config[输出目录]) # 获取待去重文件 if not os.path.exists(config[输入目录]): os.makedirs(config[输入目录]) if os.path.isdir(config[输入目录]): # 修复用os.path.join拼接路径用isfile精准筛选文件 待去重文件列表 [ os.path.join(config[输入目录], 文件名) for 文件名 in os.listdir(config[输入目录]) if os.path.isfile(os.path.join(config[输入目录], 文件名)) ] else: 待去重文件列表 [config[输入目录]] print(f总共{len(待去重文件列表)}个文件) print(待去重文件列表) 换行符 b\n if platform.system().lower() windows: 换行符 b\r\n # endregion # region 3.实际处理 # (1)分割大文件 打点() 待排序文件列表 [] for 源文件路径 in 待去重文件列表: 序号_重置(1) 文件名前缀 os.path.splitext(os.path.basename(源文件路径))[0] 缓冲区 b # 每个文件独立缓冲区避免串扰 with open(源文件路径, rb) as f: while True: # 读取一块数据 块数据 f.read(config[小文件大小]) if not 块数据: # 文件读取完毕退出循环处理剩余缓冲区 break 缓冲区 块数据 # 缓冲区大小达到阈值时进行分片切割 while len(缓冲区) config[小文件大小]: # 找到最后一个换行符的位置保证行完整 最后换行位置 缓冲区.rfind(换行符) if 最后换行位置 -1: # 极端情况单行数据超过分片大小强行切割避免卡死 要写入内容 缓冲区 缓冲区 b else: # 切割包含换行符的部分写入剩余部分留在缓冲区 换行长度 len(换行符) 要写入内容 缓冲区[:最后换行位置 换行长度] 缓冲区 缓冲区[最后换行位置 换行长度:] # 写入分片文件使用wb模式新建文件 分片路径 os.path.join( config[输出目录], f{文件名前缀}_{序号(1).zfill(2)}_{uuid1()}.txt ) with open(分片路径, wb) as ff: ff.write(要写入内容) 待排序文件列表.append(分片路径) # 处理最后剩余的缓冲区内容 if 缓冲区: 分片路径 os.path.join( config[输出目录], f{文件名前缀}_{序号(1).zfill(2)}_{uuid1()}.txt ) with open(分片路径, wb) as ff: ff.write(缓冲区) 待排序文件列表.append(分片路径) # 释放大变量内存 缓冲区, 块数据, 要写入内容 None, None, None 打点() print(f\n分割大文件完成共耗时{计时()}) print(f\n输出目录{config[输出目录]}) # endregion 打点() print(f\n\n总耗时{计时(0)}) print(———— 结束 ————) print() os.system(pause)有问题的代码import os,json,platform from uuid import uuid1 from u_工具 import 配置,打点,计时,序号,序号_重置 print(———— 开始 ————) 打点() # region 1.用来配置的变量 config { 输入目录: ./a_输入, 输出目录: ./b_输出, 小文件大小: 50 # 单位 M } config_filePath ./配置文件2.json 关联表 { 输入目录:输入目录, 输出目录:输出目录, 小文件大小:小文件大小, } if os.path.exists(config_filePath): 配置.加载(config_filePath).关联(config,关联表).重载() else: if not os.path.dirname(config_filePath): os.makedirs(os.path.dirname(config_filePath)) with open(config_filePath, w, encodingutf-8) as f: json.dump(config, f, ensure_asciiFalse, indent2) # endregion # region 2.预处理 # 调整小文件大小 扩充到M config[小文件大小] int(config[小文件大小]) * 1024 * 1024 # 目录不存在就手动建立 if not os.path.exists(config[输出目录]): os.makedirs(config[输出目录]) # 获取待去重文件 if not os.path.exists(config[输入目录]): os.makedirs(config[输入目录]) if os.path.isdir(config[输入目录]): 待去重文件列表 [f{config[输入目录]}/{i} for i in os.listdir(config[输入目录]) if not os.path.isdir(f{config[输入目录]}/{i})] else: 待去重文件列表 [config[输入目录]] print(f总共{len(待去重文件列表)}个文件) print(待去重文件列表) 换行符 b\n if platform.system().lower() windows: 换行符 b\r\n # endregion # region 3.实际处理 # (1)分割大文件 打点() 待排序文件列表 [] 待补全数据 b for 文件 in 待去重文件列表: 序号_重置(1) with open(文件, rb) as f: 文件名 os.path.basename(文件).split(.)[0] buf f.read(config[小文件大小]) while buf: data buf.split(换行符,1) 新路径 f{config[输出目录]}/{文件名}_{序号(1).zfill(2)}_{uuid1()}.txt with open(新路径, ab) as ff: ff.write(待补全数据 data[0]) 待排序文件列表.append(新路径) try: 待补全数据 data[1] except: 待补全数据 b buf f.read(config[小文件大小]) 新路径 f{config[输出目录]}/{文件名}_{序号(1).zfill(2)}_{uuid1()}.txt with open(新路径, ab) as ff: ff.write(待补全数据 换行符) 待排序文件列表.append(新路径) 待补全数据 b buf,data,待补全数据None,None,None 打点() print(f\n分割大文件完成共耗时{计时()}) print(f\n输出目录{config[输出目录]}) # endregion 打点() print(f\n\n总耗时{计时(0)}) print(———— 结束 ————) print() os.system(pause)工具类配置python3 读取配置文件重载配置文件_使用( )函数可以将配置文件重置。-CSDN博客打点计时简易计时工具-CSDN博客序号python3 随机延时 线程序号_cmd. 随机延时-CSDN博客