diff --git a/server/file_association.py b/server/file_association.py index 452e9b4..708093c 100644 --- a/server/file_association.py +++ b/server/file_association.py @@ -156,22 +156,21 @@ def read_docx_content(doc_path: Path) -> List[str]: is_datetime_line(lines[start_idx + 2]) return False - # 确定起始偏移量 - offset = 0 - if is_six_row_group(lines, 0): - offset = 0 - elif len(lines) >= 3: - # 丢弃第一行,检查第二行是否是网址且第三行是否是日期/时间 - offset = 1 - - # 按确定的行数组模式处理所有行 + # 按组处理,每组独立判断 offset + # 规则:如果第二行是网址且第三行是日期/时间,则当前 6 行为一组;否则丢弃第一行,继续判断 result = [] - i = offset + i = 0 while i + 5 <= len(lines): - combined = '\t'.join(lines[i:i+6]) - result.append(combined) - i += 6 - # 处理剩余行 + # 检查当前位置开始是否是 6 行一组模式 + if is_six_row_group(lines, i): + # 是 6 行一组,合并这 6 行 + combined = '\t'.join(lines[i:i+6]) + result.append(combined) + i += 6 + else: + # 不是 6 行一组,丢弃当前行(相当于 offset+1) + i += 1 + # 处理剩余行(不足 6 行的) while i < len(lines): result.append(lines[i]) i += 1 @@ -449,76 +448,38 @@ def main(): extract_all_zips(source_dir, "data", delete_original=args.delete_original) return - # 批量处理所有 zip 文件 + # 批量处理所有文件夹(已从 cc 目录解压好) 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")) + # 获取 cc 目录下的所有子文件夹(已解压好的文件夹) + folders = [f for f in source_dir.iterdir() if f.is_dir()] - if not zip_files: - print(f"在 {source_dir} 中未发现 zip 文件") + if not folders: + print(f"在 {source_dir} 中未发现文件夹") return - print(f"找到 {len(zip_files)} 个压缩文件,开始批量处理...") + print(f"找到 {len(folders)} 个文件夹,开始批量处理...") success_count = 0 fail_count = 0 - for zip_file in zip_files: - print(f"\n【开始处理】{zip_file.name}") + for folder in folders: + print(f"\n【开始处理】{folder.name}") # 清空 data 目录 clear_directory(data_dir) - - try: - # 先提取所有文件 - with zipfile.ZipFile(zip_file, 'r') as zip_ref: - zip_ref.extractall(data_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() + # 移动文件夹到 data 目录 + extract_dir = data_dir / folder.name + shutil.move(str(folder), str(extract_dir)) # 查找 Word 文档 word_doc = find_word_doc_recursive(extract_dir) if not word_doc: - print(f"⚠️ 在 {zip_file.name} 中未找到 Word 文档") + print(f"⚠️ 在 {folder.name} 中未找到 Word 文档") fail_count += 1 continue @@ -539,13 +500,12 @@ def main(): if not zxxk_folder.exists(): print("❌ 文件夹不存在,请先解压文件") - # 将失败的原始压缩包拷贝到本程序所在目录的 ee 子目录 + # 将失败的文件拷贝到本程序所在目录的 ee 子目录 script_dir = Path(__file__).parent ee_dir = script_dir / "ee" ee_dir.mkdir(exist_ok=True) - dest_file = ee_dir / zip_file.name - import shutil - shutil.copy2(zip_file, dest_file) + dest_file = ee_dir / folder.name + shutil.copy2(folder, dest_file) print(f" 已拷贝失败文件到:{dest_file}") fail_count += 1 continue @@ -553,13 +513,12 @@ def main(): twole_folder = base_dir / "二一教育" if not twole_folder.exists(): print("❌ 文件夹不存在,请先解压文件") - # 将失败的原始压缩包拷贝到本程序所在目录的 ee 子目录 + # 将失败的文件拷贝到本程序所在目录的 ee 子目录 script_dir = Path(__file__).parent ee_dir = script_dir / "ee" ee_dir.mkdir(exist_ok=True) - dest_file = ee_dir / zip_file.name - import shutil - shutil.copy2(zip_file, dest_file) + dest_file = ee_dir / folder.name + shutil.copy2(folder, dest_file) print(f" 已拷贝失败文件到:{dest_file}") fail_count += 1 continue @@ -573,9 +532,9 @@ def main(): print(f"✓ JSON 文件已保存到:{output_file}") - # 删除原压缩包 + # 删除原文件夹 if args.delete_original: - zip_file.unlink() + shutil.rmtree(folder) success_count += 1