批量读取文件夹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
相关产品推荐
相关产品推荐

