save a version

This commit is contained in:
2026-04-03 09:17:09 +08:00
parent 2e781ab3dc
commit 54943470af

View File

@@ -18,9 +18,19 @@ import shutil
import shutil import shutil
def clear_directory(dir_path: Path) -> None:
"""清空目录中的所有文件和子目录"""
if dir_path.exists():
for item in dir_path.iterdir():
if item.is_file():
item.unlink()
elif item.is_dir():
shutil.rmtree(item)
def extract_all_zips( def extract_all_zips(
source_dir: Union[str, Path] = "data", source_dir: Union[str, Path] = "cc",
output_dir: Optional[Union[str, Path]] = None, output_dir: Union[str, Path] = "data",
delete_original: bool = True delete_original: bool = True
) -> List[Path]: ) -> List[Path]:
""" """
@@ -35,7 +45,10 @@ def extract_all_zips(
所有解压后的目录路径列表 所有解压后的目录路径列表
""" """
source_dir = Path(source_dir) source_dir = Path(source_dir)
output_dir = Path(output_dir) if output_dir else source_dir output_dir = Path(output_dir)
# 清空 output_dir
clear_directory(output_dir)
zip_files = list(source_dir.glob("*.zip")) zip_files = list(source_dir.glob("*.zip"))
@@ -43,7 +56,7 @@ def extract_all_zips(
print(f"{source_dir} 中未发现 zip 文件") print(f"{source_dir} 中未发现 zip 文件")
return [] return []
print(f"找到 {len(zip_files)} 个压缩文件,开始解压...") print(f"找到 {len(zip_files)} 个压缩文件,开始解压{output_dir}...")
results = [] results = []
for zip_file in zip_files: for zip_file in zip_files:
# 解压到指定目录 # 解压到指定目录
@@ -240,14 +253,15 @@ def get_files_with_times(folder: Path) -> List[Tuple[Path, datetime]]:
return files return files
def extract_zip_recursive(zip_path: Path, extract_dir: Path) -> List[Path]: def extract_zip_recursive(zip_path: Path, extract_dir: Path, clear_dir: bool = True) -> List[Path]:
"""递归解压 zip 文件,如果解压后的文件还有 zip继续解压""" """递归解压 zip 文件,如果解压后的文件还有 zip继续解压"""
# 先清空 extract_dir 中的内容 # 先清空 extract_dir 中的内容
for item in extract_dir.iterdir(): if clear_dir:
if item.is_file(): for item in extract_dir.iterdir():
item.unlink() if item.is_file():
elif item.is_dir(): item.unlink()
shutil.rmtree(item) elif item.is_dir():
shutil.rmtree(item)
# 解压当前层 # 解压当前层
with zipfile.ZipFile(zip_path, 'r') as zip_ref: with zipfile.ZipFile(zip_path, 'r') as zip_ref:
@@ -306,14 +320,8 @@ def build_file_associations(
tmp_dir.mkdir(exist_ok=True) tmp_dir.mkdir(exist_ok=True)
extract_target = tmp_dir / file_path.stem extract_target = tmp_dir / file_path.stem
# 清空 extract_target 目录 # 清空 extract_target 目录
if extract_target.exists(): clear_directory(extract_target)
for item in extract_target.iterdir(): extract_target.mkdir(parents=True, exist_ok=True)
if item.is_file():
item.unlink()
elif item.is_dir():
shutil.rmtree(item)
else:
extract_target.mkdir(parents=True, exist_ok=True)
# 根据压缩格式选择解压方式 # 根据压缩格式选择解压方式
if file_path.suffix.lower() == '.zip': if file_path.suffix.lower() == '.zip':
@@ -373,6 +381,7 @@ def main():
parser = argparse.ArgumentParser(description='数据文件关联处理程序') parser = argparse.ArgumentParser(description='数据文件关联处理程序')
parser.add_argument('--extract', action='store_true', help='解压压缩文件') parser.add_argument('--extract', action='store_true', help='解压压缩文件')
parser.add_argument('--associate', action='store_true', help='建立文件关联') parser.add_argument('--associate', action='store_true', help='建立文件关联')
parser.add_argument('--batch', action='store_true', help='批量处理所有 zip 文件')
parser.add_argument('--base-dir', type=str, help='基础目录') parser.add_argument('--base-dir', type=str, help='基础目录')
parser.add_argument('--delete-original', action='store_true', help='解压后删除原文件') parser.add_argument('--delete-original', action='store_true', help='解压后删除原文件')
@@ -380,8 +389,104 @@ def main():
# 解压压缩文件 # 解压压缩文件
if args.extract: if args.extract:
source_dir = Path(args.base_dir) if args.base_dir else Path("data") source_dir = Path(args.base_dir) if args.base_dir else Path("cc")
extract_all_zips(source_dir,"tmp", delete_original=args.delete_original) extract_all_zips(source_dir, "data", delete_original=args.delete_original)
return
# 批量处理所有 zip 文件
if True or args.batch:
source_dir = Path(args.base_dir) if args.base_dir else Path("cc")
data_dir = Path("data")
server_jsons_dir = Path("server") / "jsons"
server_jsons_dir.mkdir(parents=True, exist_ok=True)
zip_files = list(source_dir.glob("*.zip"))
if not zip_files:
print(f"{source_dir} 中未发现 zip 文件")
return
# 清空 data 目录
clear_directory(data_dir)
print(f"找到 {len(zip_files)} 个压缩文件,开始批量处理...")
success_count = 0
fail_count = 0
for zip_file in zip_files:
print(f"\n【开始处理】{zip_file.name}")
# 清空当前 zip 文件的提取目录
extract_dir = data_dir / zip_file.stem
if extract_dir.exists():
clear_directory(extract_dir)
try:
# 解压
with zipfile.ZipFile(zip_file, 'r') as zip_ref:
for member in zip_ref.infolist():
zip_ref.extract(member, data_dir)
member_path = data_dir / zip_file.stem / member.filename
if member_path.exists():
date_time = datetime(*member.date_time[:5])
timestamp = date_time.timestamp()
os.utime(member_path, (timestamp, timestamp))
# 检查是否多了一层目录
inner_dir = extract_dir / zip_file.stem
if inner_dir.is_dir() and len(list(extract_dir.iterdir())) == 1:
for item in inner_dir.iterdir():
item.rename(extract_dir / item.name)
inner_dir.rmdir()
# 查找 Word 文档
word_doc = find_word_doc_recursive(extract_dir)
if not word_doc:
print(f"⚠️ 在 {zip_file.name} 中未找到 Word 文档")
fail_count += 1
continue
# 读取 Word 内容
word_content = read_word_content(word_doc)
if not word_content:
print(f"⚠️ 无法读取 Word 文档内容")
fail_count += 1
continue
base_dir = word_doc.parent
print(f"✓ 找到 Word 文档:{word_doc}")
print(f" 关联目录:{base_dir}")
# 建立文件关联
twole_folder = base_dir / "21世纪教育网"
zxxk_folder = base_dir / "学科网"
if not twole_folder.exists() or not zxxk_folder.exists():
print("❌ 文件夹不存在,请先解压文件")
fail_count += 1
continue
associations = build_file_associations(word_content, twole_folder, zxxk_folder)
# 保存 JSON 文件
output_file = server_jsons_dir / f"{word_doc.stem}.json"
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(associations, f, ensure_ascii=False, indent=2)
print(f"✓ JSON 文件已保存到:{output_file}")
# 删除原压缩包
if args.delete_original:
zip_file.unlink()
success_count += 1
except Exception as e:
print(f"❌ 处理失败:{e}")
fail_count += 1
print(f"\n===== 批量处理完成 =====")
print(f"成功:{success_count}, 失败:{fail_count}")
return return
# 建立文件关联 # 建立文件关联