Files
2026-07-13 17:55:17 +08:00

176 lines
5.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
import shutil
import re
from datetime import datetime
import time
def find_latest_txt_file():
"""
在当前运行目录下查找最新修改的 .txt 文件,排除 config.txt
"""
cwd = os.getcwd()
txt_files = [
os.path.join(cwd, f)
for f in os.listdir(cwd)
if f.lower().endswith(".txt") and not f.lower().startswith("config")
]
if not txt_files:
raise FileNotFoundError("当前目录下未找到任何非config的 .txt 文件")
latest_txt = max(txt_files, key=os.path.getmtime)
return latest_txt
def load_extensions(config_path):
"""
从 config.txt 读取需要的文件后缀集合
"""
exts = set()
with open(config_path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip().lower()
if not line or line.startswith("#"):
continue
if not line.startswith("."):
line = "." + line
exts.add(line)
return exts
def extract_and_copy_files(compile_order_path):
"""
从 report_compile_order 输出文件中:
- 提取 Source Compile OrderDesign Sources第一个段落
- 只保留 config.txt 中指定的需要的文件类型
- 按完整路径复制文件
"""
try:
# 读取 config.txt 中需要的文件后缀
config_path = os.path.join(os.getcwd(), "config.txt")
if not os.path.exists(config_path):
raise FileNotFoundError("当前目录下未找到 config.txt")
include_exts = load_extensions(config_path)
print(f"从 config.txt 加载需要的文件后缀: {include_exts}")
# ---------- 读取文件 ----------
with open(compile_order_path, "r", encoding="utf-8") as f:
lines = f.readlines()
# ---------- 定位 Source Compile Order 段落 ----------
start_idx = None
end_idx = None
for i, line in enumerate(lines):
if line.startswith("Source compile order for 'synthesis'"):
start_idx = i
continue
if start_idx is not None and line.strip() == "":
end_idx = i
break
if start_idx is None:
raise RuntimeError("未找到 Source compile order for 'synthesis' 段落")
if end_idx is None:
end_idx = len(lines)
section = lines[start_idx:end_idx]
# ---------- 跳过标题 + 表头 ----------
data_lines = section[2:]
extracted_paths = []
for line in data_lines:
line = line.rstrip()
if not line:
continue
# 行首必须是索引号
if not re.match(r"\s*\d+\s+", line):
continue
# 用 2 个及以上空格分割,最后一列一定是完整路径
parts = re.split(r"\s{2,}", line)
if not parts:
continue
full_path = parts[-1]
# ---------- 只保留 config.txt 中指定的需要的文件类型 ----------
file_ext = os.path.splitext(full_path)[1].lower()
if include_exts and file_ext not in include_exts:
continue
extracted_paths.append(full_path)
print(f"提取到 {len(extracted_paths)} 个需要的文件")
# ---------- 创建输出目录 ----------
now = datetime.now()
out_dir = now.strftime("Copy_Files_%Y%m%d_%H%M%S")
os.makedirs(out_dir)
print(f"创建输出目录: {out_dir}")
# ---------- 复制文件 ----------
copied = 0
skipped = 0
for src in extracted_paths:
if not os.path.exists(src):
print(f"文件不存在,跳过: {src}")
skipped += 1
continue
base = os.path.basename(src)
dst = os.path.join(out_dir, base)
# 避免重名覆盖
if os.path.exists(dst):
name, ext = os.path.splitext(base)
idx = 1
while True:
new_dst = os.path.join(out_dir, f"{name}_{idx}{ext}")
if not os.path.exists(new_dst):
dst = new_dst
break
idx += 1
shutil.copy2(src, dst)
copied += 1
print("\n复制完成")
print(f" 成功复制: {copied}")
print(f" 跳过文件: {skipped}")
print(f" 输出目录: {os.path.abspath(out_dir)}")
return extracted_paths
except Exception as e:
print("处理过程中发生错误:")
print(e)
return None
if __name__ == "__main__":
try:
input_file = find_latest_txt_file()
print(f"使用最新的 txt 文件: {input_file}")
result = extract_and_copy_files(input_file)
if not result:
print("未提取到任何文件")
except Exception as e:
print("程序异常退出:")
print(e)
finally:
input("\n按回车键关闭窗口...")