Python 用 docx 处理 Word 中表格时出现的文本重复问题

这两天用docx提取Word中表格时, 发现对于稍稍复杂一点的表格就会出现很多重复项, 比如

一张很常见的Word中的表格

使用代码

1
2
3
4
5
6
7
8
9
10
11
12
table_temp = []
path = r"./demo.docx"

document = Document(path)
tables = document.tables

for row in tables[0].rows:
row_temp = []
for cell in row.cells:
row_temp.append(cell.text)
table_temp.append(row_temp)
table_temp

其得到结果部分为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
['从何时开始\n运行',
'\n\n2017.10',
'每年运行费用(万元)',
'每年运行费用(万元)',
'每年运行费用(万元)',
'\n\n2',
'场地\n面积',
'600㎡',
'600㎡',
'600㎡',
'600㎡',
'场地产权是否归团组织(如否,请注明使用年限)',
'场地产权是否归团组织(如否,请注明使用年限)',
'场地产权是否归团组织(如否,请注明使用年限)',
'是',
'是'],
['上级团组织或同级财政是否有配套经费',
'无',
'配套经费\n(万元)',
'配套经费\n(万元)',
'配套经费\n(万元)',
'',
'专职工作人员数',
'现有',
'现有',
'拟安排',
'拟安排',
'兼职工作人员数',
'兼职工作人员数',
'兼职工作人员数',
'现有',
'拟安排'],
['上级团组织或同级财政是否有配套经费',
'无',
'配套经费\n(万元)',
'配套经费\n(万元)',
'配套经费\n(万元)',
'',
'专职工作人员数',

最初我试图跳过已出现的文本, 但是有不少文本本来就是多次出现的, 遂作罢.

之后阅读了部分源代码发现, 那些程序性重复文本是对同一个对象的引用, 所以只要在读取一个值后对其text置空或者任意自定义的其他, 就可以把后面将要出现的程序性重复项也设置为自定义项.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
table_temp = []
path = r"demo.docx"
null_text = str(time.time())

document = Document(path)
tables = document.tables

for row in tables[0].rows:
row_temp = []
for cell in row.cells:
if cell.text != null_text:
row_temp.append(cell.text)
cell.text = null_text
table_temp.append(row_temp)
table_temp

可得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[['申报平台\n名称'],
['负责人\n是否专职', '负责人\n姓 名', '手机'],
['平台所在地址及邮编', '联系电话 '],
['从何时开始\n运行', '每年运行费用(万元)', '场地\n面积', '场地产权是否归团组织(如否,请注明使用年限)'],
['上级团组织或同级财政是否有配套经费',
'配套经费\n(万元)',
'专职工作人员数',
'现有',
'拟安排',
'兼职工作人员数',
'现有',
'拟安排'],
[],
['是否与系统团组织共建', '共建单位名称'],
['申请\n经费用途'],
['综合服务平台或建设团组织近三年获得的荣誉'],
['已\n开\n展\n的\n服\n务\n项\n目', '项目名称', '项目内容', '服务群体', '服务人数']]

至此, 只要稍稍处理下规则就能愉快地格式化数据了


吐槽:

docx对于表格的处理真的太麻缠了, 几乎要被逼换vba, QWQ


从我的知乎文章搬运而来