You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量读取文件夹DOCX文件提取表格生成DataFrame出现AttributeError问题

错误原因
  • 你批量处理代码中遍历得到的document是字符串类型的文件名,没有通过Document()加载为python-docx的文档对象,直接调用.tables属性就会触发字符串对象无该属性的报错。
  • 代码中df='df_' + document是错误赋值,会把刚生成的DataFrame对象覆盖为字符串,后续调用.iloc时也会触发同类属性错误。
修复后的完整代码

你可以直接复用已经测试可用的单文件处理函数,批量读取的逻辑调整如下:

import pandas as pd
from docx import Document
import os

directory = 'C:\\folder1\\Folder2\\Folder3\\Folder4'

def read_docx_table(document,table_num=1,nheader=1):
    table = document.tables[table_num-1]
    data = [[cell.text for cell in row.cells] for row in table.rows]
    df = pd.DataFrame(data)
    if nheader == 1:
        df = df.rename(columns=df.iloc[0]).drop(df.index[0]).reset_index(drop=True)
    elif nheader == 2:
        outside_col, inside_col = df.iloc[0], df.iloc[1]
        hier_index = pd.MultiIndex.from_tuples(list(zip(outside_col,inside_col)))
        df = pd.DataFrame(data,columns=hier_index).drop(df.index[[0,1]]).reset_index(drop=True)
    elif nheader > 2:
        print("暂不支持超过2行表头的场景")
        df = pd.DataFrame()
    return df

# 用字典存储所有读取结果,key为docx文件名,value为对应提取得到的DataFrame
df_result_map = {}
for root, dirs, files in os.walk(directory):
    for file_name in files:
        if file_name.endswith('.docx'):
            # 拼接得到文件的完整绝对路径
            full_file_path = os.path.join(root, file_name)
            # 加载为Document对象
            doc_obj = Document(full_file_path)
            # 按需求指定表格序号、表头行数
            table_num = 4
            nheader = 2
            # 读取表格生成DataFrame
            current_df = read_docx_table(doc_obj, table_num, nheader)
            df_result_map[file_name] = current_df
            # 可按需直接输出或后续批量处理
            print(f"{file_name} 表格读取完成,数据行数:{current_df.shape[0]}")

如果需要单独访问某个文件的DataFrame,直接通过df_result_map["目标文件名.docx"]调用即可。

内容的提问来源于stack exchange,提问作者newcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:15:04