解决np.where报错ValueError:仅可比较标签一致的Series对象问题
解决Python重命名PDF时的Series匹配错误问题
错误原因
你遇到的ValueError: Can only compare identically-labeled Series objects,是因为直接用np.where比较FichierRepertoire['File']和df['ID']时,两个Series的索引或长度不匹配。Pandas要求逐元素比较的Series必须有完全一致的标签(索引),否则会触发这个错误。
可行解决方案
下面两种方法都能实现ID与文件名的匹配并生成新文件名,避免索引对齐问题:
方法一:用Pandas Merge合并数据集(适合批量处理)
这种方法先把目录文件和Excel数据合并,再统一生成新文件名:
import os import pandas as pd # 1. 读取Excel中的ID和Title映射 df = pd.read_excel("your_excel_file.xlsx") # 2. 扫描目标目录,整理PDF文件信息 pdf_dir = "/path/to/your/pdf/folder" pdf_files = [f for f in os.listdir(pdf_dir) if f.lower().endswith(".pdf")] # 生成包含文件名(不含后缀)和完整路径的DataFrame file_df = pd.DataFrame({ "FileID": [os.path.splitext(f)[0] for f in pdf_files], # 假设文件名就是ID "OldPath": [os.path.join(pdf_dir, f) for f in pdf_files] }) # 3. 合并两个数据集,按ID匹配Title merged = pd.merge(file_df, df, left_on="FileID", right_on="ID", how="left") # 4. 生成新文件名:匹配到Title就用Title,否则保留原文件名 merged["NewFileName"] = merged.apply( lambda x: f"{x['Title']}.pdf" if pd.notna(x['Title']) else f"{x['FileID']}.pdf", axis=1 ) # 5. 执行重命名 for _, row in merged.iterrows(): os.rename(row["OldPath"], os.path.join(pdf_dir, row["NewFileName"]))
方法二:用字典映射(轻量高效)
如果不需要批量查看匹配结果,直接用字典做ID到Title的映射更简单:
import os import pandas as pd # 1. 构建ID到Title的字典映射 df = pd.read_excel("your_excel_file.xlsx") id_title_map = df.set_index("ID")["Title"].to_dict() # 2. 遍历目录重命名文件 pdf_dir = "/path/to/your/pdf/folder" for filename in os.listdir(pdf_dir): if filename.lower().endswith(".pdf"): # 提取文件名中的ID(假设文件名就是ID,如"123.pdf") file_id = os.path.splitext(filename)[0] # 查找对应Title,找不到则保留原ID作为文件名 new_title = id_title_map.get(file_id, file_id) new_filename = f"{new_title}.pdf" # 执行重命名 os.rename( os.path.join(pdf_dir, filename), os.path.join(pdf_dir, new_filename) )
特殊情况处理
如果PDF文件名不是纯ID(比如invoice_456.pdf),可以用正则提取ID:
import re file_id = re.search(r"\d+", filename).group() # 提取文件名中的数字作为ID
内容的提问来源于stack exchange,提问作者Philippe gauthier
相关产品推荐
相关产品推荐

