Python是一种强大的编程语言,特别擅长自动化任务。它拥有众多库,使得创建可重用的代码变得简单。其中之一便是python-docx库。这个库在文档处理方面非常有用,功能包括但不限于:
本文将特别讨论Docx库的一个功能:创建与文档中表格数量相同的数据帧,以便之后可以将这些表格存储为单独的文件(如CSV),方便使用。尽管Python-Docx库可以创建和更新Microsoft Word文件,本文将使用它来:
虽然该库的文档有限,但可以通过以下链接进行进一步阅读:
在开始编码之前,简要讨论一下数据帧。数据帧是二维的表格数据结构,由行和列组成,包含不同类型的元素。例如,如果考虑一个“员工”数据帧,列可以是“姓名”、“年龄”、“性别”、“薪水”、“入职日期”。上述数据帧的结果结构如下:
从上述图形中,可以看到不同类型的组件。例如,姓名是字符串类型数据,年龄是数字,性别是字符,薪水是双精度,入职日期是日期类型字段。可以使用列表、字典或简单地导入文件来创建数据帧。大多数数据分析、数据操作、提取等工作都可以在将数据作为数据帧获取后进行。
将使用以下文档进行编码,如下所示。该文档包含两个表格。因此,代码也将创建两个数据帧。
函数是执行特定任务的命令集合。函数避免了重复,是创建可重用组件的好方法。它将程序分解为模块。它使代码更容易管理和理解。函数使用关键字“def”在Python中编写。它后面跟着唯一的函数名和传递参数。冒号(:)标志着函数头的结束。函数可以有返回语句或没有返回语句。返回语句标志着函数的退出。然后控制返回到调用地点。这取决于编写函数的任务的性质。可以使用函数名在另一个函数或程序中调用函数。如果函数定义为接受参数,可以传递参数。
在本文中,定义了一个名为“create_df_from_table”的函数。它接受两个参数。它们是“c”和“tab”。第一个参数是一个整数,其值从0开始。第二个参数是“document.tables”的表格输出。
将使用两个库——Docx和pandas。Python-Docx是一个可以处理Microsoft Word文件的Python库。Pandas是一个用于分析数据的Python库。
import docximport pandas as pd
让创建一个名为testdoc.docx的示例Word文档文件。该文档文件包含一个标题。有两个表格和两个段落。第一个表格有四行三列,不包括标题行。第二个表格有两行两列,不包括标题行。“Document”对象用于读取Docx文件。
document = docx.Document('testdoc.docx')
文档中有两个段落。标题也被视为一个段落。文档中的两个表格在Docx模块中不被视为段落。当运行以下命令时,会显示两个段落以及文档标题。
para_text_list = []for each_par in document.paragraphs: print(each_par.text) para_text_list.append(each_par.text)
将创建一个可重用的函数来读取表格。函数应该创建,以便它找到文档中的所有表格并为所有表格创建单独的数据帧。在此定义中,假设每个表格都有一个标题。第一行将被视为列名,其余的作为行值。将为数据帧名称加上前缀“result_df_”,计数从0开始。例如,如果Word文档中有三张表格,那么创建的数据帧名称是result_df_0、result_df_1和result_df_2。
def create_df_from_table(c, tab): list_name = str(c)+"_result_list" list_name = [] for i, each_row in enumerate(tab.rows): text = (each_cell.text for each_cell in each_row.cells) if i == 0: keys = tuple(text) else: each_dict_val = dict(zip(keys, text)) list_name.append(each_dict_val) result_df = pd.DataFrame(list_name) return result_dffor c, each_tab in enumerate(document.tables): globals()[f'result_df_{c}'] = create_df_from_table(c, each_tab)
如上所示,创建了两个数据帧。
将计算Word文档每个部分的长度。使用“len”和“sum”函数来找到字数。
words_each_list = [len(each_sent.split()) for each_sent in para_text_list]print(words_each_list)total_no_of_words = sum(words_each_list)print(total_no_of_words)