建模程序 多个定时程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

100 lines
4.1 KiB

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