176 lines
5.0 KiB
Python
176 lines
5.0 KiB
Python
|
|
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 Order(Design 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按回车键关闭窗口...")
|