#python-3.x #pandas #dataframe #python-docx
Вопрос:
Я пытаюсь написать код, в котором мне нужно прочитать несколько файлов docx, извлечь определенную таблицу из каждого файла docx и создать кадры данных для каждого из них. мой код звучит так:
import pandas as pd from docx import Document import os directory = 'C:\folder1\Folder2\Folder3\Folder4' for root, dirs, files in os.walk(directory): for document in files: if document.endswith('.docx'): table_num=4 nheader=2 table =document.tables[table_num-1] data=[[cell.text for cell in row.cells] for row in table.rows] df = pd.DataFrame(data) df='df_' document 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)
Я получаю ошибку Ошибка атрибута: объект » str » не имеет атрибута «таблицы»
но я смог запустить то же самое для одного файла в качестве функции.
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 nheadergt;2: print("Not Working") df.DataFrame() return df document = Document("file1.docx") table_num=2 nheader=0 df = read_docx_table(document,table_num,nheader) print(df)
Ответ №1:
В вашем коде ниже у вас есть эта строка
document = Document("file1.docx")
таким образом, документ больше не является строкой с именем файла.
В другой части вы получаете ошибку, потому что документ по-прежнему является строкой
table = document.tables[table_num-1]
и строка не имеет таблиц атрибутов.
Правка: Есть еще одна строка, которая вызовет ошибку.
df = pd.DataFrame(data) df = 'df_' filename # lt;---- change df to a string outside_col,inside_col =df.iloc[0],df.iloc[1]
вы меняете df на строку, а затем пытаетесь использовать «iloc» в строке…не сработает.