如何将openpyxl的DocumentProperties转换为DataFrame、字典或字符串?
处理openpyxl DocumentProperties对象的实用方法
1. 把对象转成字典
openpyxl的DocumentProperties对象包含文档元数据(作者、最后修改者、创建时间等),可以通过过滤私有属性(带下划线_)转成字典,写个简单函数即可:
def props_to_dict(document_props): # 提取非私有、非方法的属性键值对 return { key: value for key, value in document_props.__dict__.items() if not key.startswith('_') and not callable(value) }
调用示例:
from openpyxl import load_workbook wb = load_workbook("excel_file.xlsx", read_only=True) # 只读模式更高效 props_dict = props_to_dict(wb.properties)
props_dict里会包含author、lastModifiedBy、created、modified等常用字段。
2. 保存为变量
直接赋值就能把元数据存为变量,两种形式都可以:
# 保存原DocumentProperties对象 saved_props = wb.properties # 保存字典形式的元数据 saved_props_dict = props_dict
3. 转换为DataFrame
如果要批量处理目录下的Excel文件,先把每个文件的属性字典存进列表,再转成DataFrame:
import pandas as pd import os props_list = [] # 遍历目录及子目录 for root, _, files in os.walk("./your_excel_dir"): for file in files: if file.endswith((".xlsx", ".xlsm")): file_path = os.path.join(root, file) wb = load_workbook(file_path, read_only=True) props_dict = props_to_dict(wb.properties) props_dict["file_path"] = file_path # 追加文件路径方便溯源 props_list.append(props_dict) wb.close() # 只读模式记得关闭 # 转成DataFrame df = pd.DataFrame(props_list) # 可直接保存为CSV df.to_csv("excel_metadata.csv", index=False, encoding="utf-8-sig")
4. 整体存储元数据
方法一:用pickle存储原对象
你之前的pickle用法有误,正确操作是用pickle模块来序列化对象,而非调用对象的pickle.dump():
import pickle # 保存原DocumentProperties对象 with open("excel_props.pkl", "wb") as f: pickle.dump(wb.properties, f) # 读取还原对象 with open("excel_props.pkl", "rb") as f: loaded_props = pickle.load(f) # 读取后仍可调用属性,比如 loaded_props.lastModifiedBy
方法二:存为JSON(跨语言通用)
由于DocumentProperties里的created、modified是datetime对象,JSON无法直接序列化,需先转成字符串:
import json from datetime import datetime def serialize_datetime(obj): if isinstance(obj, datetime): return obj.strftime("%Y-%m-%d %H:%M:%S") raise TypeError(f"Type {type(obj)} not serializable") # 把字典转成JSON字符串 props_json = json.dumps(props_dict, default=serialize_datetime, ensure_ascii=False) # 保存到文件 with open("excel_props.json", "w", encoding="utf-8") as f: f.write(props_json) # 读取JSON并还原字典 with open("excel_props.json", "r", encoding="utf-8") as f: loaded_dict = json.load(f) # 如需转回datetime,可使用 datetime.strptime(loaded_dict["created"], "%Y-%m-%d %H:%M:%S")
内容的提问来源于stack exchange,提问作者HHB
相关产品推荐
相关产品推荐

