import os,time import re from download_batch_data.utils.logs import log def changeMtlFile(localMtlPath,newName): beginTime = time.time() try: # 使用更高效的文件读取方式 [6,8](@ref) with open(localMtlPath, 'r', encoding='utf-8') as f: content = f.read() # 使用字符串方法直接查找和替换,避免不必要的循环 [9](@ref) lines = content.split('\n') for i, line in enumerate(lines): stripped_line = line.strip() if stripped_line.startswith('map_Kd '): lines[i] = f"map_Kd {newName}" break # 批量写入,减少I/O操作 [6](@ref) with open(localMtlPath, 'w', encoding='utf-8') as f: f.write('\n'.join(lines)) except IOError as e: log(f"处理文件 {localMtlPath} 时出错: {e}") return False except UnicodeDecodeError as e: log(f"文件编码错误 {localMtlPath}: {e}") return False endTime = time.time() log(f"修改文件文件内容 {localMtlPath} : 耗时{endTime - beginTime}秒") return True def changeObjFile(localObjPath,newName): beginTime = time.time() try: # 优化策略:mtllib通常在文件前几行,先只读取前100行 # 对于大文件(如155万行),这样可以大幅减少内存使用和处理时间 with open(localObjPath, 'r', encoding='utf-8') as f: first_100_lines = [] mtllib_line_idx = -1 # 读取前100行查找mtllib for i in range(100): line = f.readline() if not line: break first_100_lines.append(line) if mtllib_line_idx == -1 and line.strip().startswith('mtllib '): mtllib_line_idx = i # 如果在前100行找到了mtllib,直接修改 if mtllib_line_idx != -1: parts = first_100_lines[mtllib_line_idx].split(' ', 1) if len(parts) > 1: #old_mtl_name = parts[1].strip() new_mtl_name = f"{newName}" first_100_lines[mtllib_line_idx] = f"mtllib {new_mtl_name}\n" # 读取剩余内容并合并 remaining_content = f.read() # 写回文件 with open(localObjPath, 'w', encoding='utf-8') as f_out: f_out.writelines(first_100_lines) if remaining_content: f_out.write(remaining_content) endTime = time.time() log(f"修改文件文件内容 {localObjPath} : 耗时{endTime - beginTime}秒") return True log(f"浪费时间读取完整的文件,进行替换mtllib路径, localObjPath={localObjPath}, newName={newName}") # 如果前100行没找到,读取整个文件(很少见的情况) f.seek(0) # 重置文件指针 content = f.read() # 使用正则表达式一次性替换(更高效) pattern = r'^mtllib\s+(.+)$' def replace_mtllib(match): old_mtl_name = match.group(1).strip() new_mtl_name = f"{newName}_{old_mtl_name}" return f"mtllib {new_mtl_name}" new_content = re.sub(pattern, replace_mtllib, content, flags=re.MULTILINE) if new_content != content: with open(localObjPath, 'w', encoding='utf-8') as f_out: f_out.write(new_content) endTime = time.time() log(f"完整读取修改文件文件内容 {localObjPath} : 耗时{endTime - beginTime}秒") return True except IOError as e: print(f"处理文件 {localObjPath} 时出错: {e}") return False except UnicodeDecodeError as e: print(f"文件编码错误 {localObjPath}: {e}") return False return False