This commit is contained in:
2026-04-05 21:54:46 +08:00
parent 2273f62843
commit 9d643187ae

View File

@@ -156,22 +156,21 @@ def read_docx_content(doc_path: Path) -> List[str]:
is_datetime_line(lines[start_idx + 2]) is_datetime_line(lines[start_idx + 2])
return False return False
# 确定起始偏移量 # 按组处理,每组独立判断 offset
offset = 0 # 规则:如果第二行是网址且第三行是日期/时间,则当前 6 行为一组;否则丢弃第一行,继续判断
if is_six_row_group(lines, 0):
offset = 0
elif len(lines) >= 3:
# 丢弃第一行,检查第二行是否是网址且第三行是否是日期/时间
offset = 1
# 按确定的行数组模式处理所有行
result = [] result = []
i = offset i = 0
while i + 5 <= len(lines): while i + 5 <= len(lines):
# 检查当前位置开始是否是 6 行一组模式
if is_six_row_group(lines, i):
# 是 6 行一组,合并这 6 行
combined = '\t'.join(lines[i:i+6]) combined = '\t'.join(lines[i:i+6])
result.append(combined) result.append(combined)
i += 6 i += 6
# 处理剩余行 else:
# 不是 6 行一组,丢弃当前行(相当于 offset+1
i += 1
# 处理剩余行(不足 6 行的)
while i < len(lines): while i < len(lines):
result.append(lines[i]) result.append(lines[i])
i += 1 i += 1
@@ -449,76 +448,38 @@ def main():
extract_all_zips(source_dir, "data", delete_original=args.delete_original) extract_all_zips(source_dir, "data", delete_original=args.delete_original)
return return
# 批量处理所有 zip 文件 # 批量处理所有文件夹(已从 cc 目录解压好)
if True or args.batch: if True or args.batch:
source_dir = Path(args.base_dir) if args.base_dir else Path("cc") source_dir = Path(args.base_dir) if args.base_dir else Path("cc")
data_dir = Path("data") data_dir = Path("data")
server_jsons_dir = Path("server") / "jsons" server_jsons_dir = Path("server") / "jsons"
server_jsons_dir.mkdir(parents=True, exist_ok=True) server_jsons_dir.mkdir(parents=True, exist_ok=True)
zip_files = list(source_dir.glob("*.zip")) # 获取 cc 目录下的所有子文件夹(已解压好的文件夹)
folders = [f for f in source_dir.iterdir() if f.is_dir()]
if not zip_files: if not folders:
print(f"{source_dir} 中未发现 zip 文件") print(f"{source_dir} 中未发现文件")
return return
print(f"找到 {len(zip_files)}压缩文件,开始批量处理...") print(f"找到 {len(folders)} 个文件,开始批量处理...")
success_count = 0 success_count = 0
fail_count = 0 fail_count = 0
for zip_file in zip_files: for folder in folders:
print(f"\n【开始处理】{zip_file.name}") print(f"\n【开始处理】{folder.name}")
# 清空 data 目录 # 清空 data 目录
clear_directory(data_dir) clear_directory(data_dir)
try: try:
# 先提取所有文件 # 移动文件夹到 data 目录
with zipfile.ZipFile(zip_file, 'r') as zip_ref: extract_dir = data_dir / folder.name
zip_ref.extractall(data_dir) shutil.move(str(folder), str(extract_dir))
IsdirectorExtracted = False
extract_dir = data_dir / zip_file.stem
# 然后遍历所有成员,设置时间戳
with zipfile.ZipFile(zip_file, 'r') as zip_ref:
for member in zip_ref.infolist():
# 计算解压后的实际路径
# 解压后,文件可能在 data_dir/zip_file.stem/ 目录下
# 或者在 data_dir/ 下(如果 zip 内部没有额外的目录层)
base_extract_path = data_dir / zip_file.stem
# 如果 member.filename 以 zip_file.stem/开头,需要先去掉这个前缀
if member.filename.startswith(zip_file.stem + '/') or member.filename.startswith(zip_file.stem + os.sep):
relative_path = member.filename[len(zip_file.stem) + 1:]
member_path = base_extract_path / relative_path
else:
# 否则直接在 base_extract_path 下查找
member_path = data_dir / member.filename
IsdirectorExtracted = True
# 如果路径存在,设置时间戳
if member_path.exists():
try:
date_time = datetime(*member.date_time[:5])
timestamp = date_time.timestamp()
os.utime(member_path, (timestamp, timestamp))
except Exception:
pass
if IsdirectorExtracted:
extract_dir = data_dir
# 检查是否多了一层目录
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 文档
word_doc = find_word_doc_recursive(extract_dir) word_doc = find_word_doc_recursive(extract_dir)
if not word_doc: if not word_doc:
print(f"⚠️ 在 {zip_file.name} 中未找到 Word 文档") print(f"⚠️ 在 {folder.name} 中未找到 Word 文档")
fail_count += 1 fail_count += 1
continue continue
@@ -539,13 +500,12 @@ def main():
if not zxxk_folder.exists(): if not zxxk_folder.exists():
print("❌ 文件夹不存在,请先解压文件") print("❌ 文件夹不存在,请先解压文件")
# 将失败的原始压缩包拷贝到本程序所在目录的 ee 子目录 # 将失败的文件拷贝到本程序所在目录的 ee 子目录
script_dir = Path(__file__).parent script_dir = Path(__file__).parent
ee_dir = script_dir / "ee" ee_dir = script_dir / "ee"
ee_dir.mkdir(exist_ok=True) ee_dir.mkdir(exist_ok=True)
dest_file = ee_dir / zip_file.name dest_file = ee_dir / folder.name
import shutil shutil.copy2(folder, dest_file)
shutil.copy2(zip_file, dest_file)
print(f" 已拷贝失败文件到:{dest_file}") print(f" 已拷贝失败文件到:{dest_file}")
fail_count += 1 fail_count += 1
continue continue
@@ -553,13 +513,12 @@ def main():
twole_folder = base_dir / "二一教育" twole_folder = base_dir / "二一教育"
if not twole_folder.exists(): if not twole_folder.exists():
print("❌ 文件夹不存在,请先解压文件") print("❌ 文件夹不存在,请先解压文件")
# 将失败的原始压缩包拷贝到本程序所在目录的 ee 子目录 # 将失败的文件拷贝到本程序所在目录的 ee 子目录
script_dir = Path(__file__).parent script_dir = Path(__file__).parent
ee_dir = script_dir / "ee" ee_dir = script_dir / "ee"
ee_dir.mkdir(exist_ok=True) ee_dir.mkdir(exist_ok=True)
dest_file = ee_dir / zip_file.name dest_file = ee_dir / folder.name
import shutil shutil.copy2(folder, dest_file)
shutil.copy2(zip_file, dest_file)
print(f" 已拷贝失败文件到:{dest_file}") print(f" 已拷贝失败文件到:{dest_file}")
fail_count += 1 fail_count += 1
continue continue
@@ -573,9 +532,9 @@ def main():
print(f"✓ JSON 文件已保存到:{output_file}") print(f"✓ JSON 文件已保存到:{output_file}")
# 删除原压缩包 # 删除原文件夹
if args.delete_original: if args.delete_original:
zip_file.unlink() shutil.rmtree(folder)
success_count += 1 success_count += 1