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
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 |