【Python】批量获取多个docx文档中特定段落源码
# 介绍**用 于 :提取多个包含某一关键词的docx文档。例如:有100个docx文档中,需要你提取这100个docx文档中所有包含“本院认为”的段落**
**实现效果 :运行脚本,等待提取符合要求的段落后,脚本自动将符合要求的段落保存在同目录下的一个新建txt文件内**
**脚本需求 :需要安装docx模块,相关安装代码:`pip install docx` **
# 源码
```python
import docx
import re
import os
def getpara(path):
try :
docx_temp = docx.Document(path)
except :
print("打不开呀")
return False
try :
docx_para = docx_temp.paragraphs
print("成功读取:",path)
return docx_para
except :
print("can't get the ",path," paragraphs")
return False
def findpara(paras, str="本院认为"):
try:
para_list = ["赋值待删"]
pattern = re.compile(str)
for para in paras:
match1 = pattern.search(para.text)
if match1:
para_list.append(para.text)
para_list.pop(0)
return para_list
except:
return False
def list2txt(list,name="汇总输出") :
if len(list) :
try :
fp = open("汇总输出.txt","a")
for cloe in list :
fp.write(cloe)
fp.write("\n")
except :
return False
finally:
fp.close()
def set_wd(wd='0') :
if wd == 'C:/Users/Administrator/Desktop/基层法院' :
try :
os.chdir(wd)
File_List = os.listdir(wd)
return File_List
except :
print("目录有问题")
return False
else :
try :
wd = os.getcwd()
os.chdir(wd)
print("使用当前路径名")
File_List = os.listdir(wd)
return File_List
except :
print("Error")
return False
wd='C:/Users/Administrator/Desktop/基层法院'
File_list=set_wd(wd='C:/Users/Administrator/Desktop/基层法院')
for i in File_list:
paths = 'C:/Users/Administrator/Desktop/基层法院/'+i
docx_para=getpara(paths)
para_list=findpara(docx_para, i, str="本院认为")
list2txt(para_list, name="汇总输出")
```
# 思路(从调用函数上一步一步讲:)
## 分析`wd='C:/Users/Administrator/Desktop/基层法院'`
**首先给wd赋一个地址值,也就是你100个文档所在的目录(注意地址分隔符用'/'而不要用'\',原因是后者为转义符。会和地址中的字母符号组合转义导致报错)**
## 分析 `File_list=set_wd(wd='C:/Users/Administrator/Desktop/基层法院')`
**
观察调用语句:首先调用了set_wd函数,判断如果wd和默认地址相同就调用os模块的chdir函数以获取目录下所有文件的名称(包含后缀)并在内存中组建一个file list列表。最后返回一个file list的值赋值给File_list。
**
## 分析 `for i in File_list`
**Python的循环为for in循环,我理解为遍历。从file list内逐行赋值给i**
## 分析 `paths = 'C:/Users/Administrator/Desktop/基层法院/'+i`
**给paths逐个赋“基层法院”文件夹内所有文件的具体地址值,(比如:C:/Users/Administrator/Desktop/基层法院/张三防卫过当案审判书.docx)**
## 分析 ` docx_para=getpara(paths)`
**
接下来调用getpara函数,将上面paths获取docx文件具体地址值之后,作为实参带入到getpara函数内。这里做一个try语句的目的是避免文件夹内非docx文件被读取而报错。然后调用docx模块的document函数以读取当前文档的段落,如果读取成功就把段落返回给docx_para函数。不成功的话,可能是文档有密码或者文档被损坏,或者就是所读取的文档是doc格式而不是docx,这就需要格式转换一下了。
**
## 分析 `para_list=findpara(docx_para,str="本院认为")`
**
这里调用了有2个形参的findpara函数,2个实参分别为①文档所有段落②段落关键词str="本院认为"
findpara函数首先给paralist随便赋一个值,然后就开始对所有获取的段落进行搜寻,找到包含str关键词的段落后,就用append追加到段落列表para_list里。然后用pop(0)把最开始任意赋的值给删除掉。然后将包含关键词的段落返回给para_list。
**
## 分析 `list2txt(para_list, name="汇总输出")`
**
最后就理所应当的是把所有关键段落保存在一个新建的txt文档里,open函数新建或者打开"汇总输出.txt",然后打开方式为"a",也就是追加的意思。然后就是一系列写入、换行、然后finally关闭文件的操作。
**
**
好了,分析就这样结束了。本人接触Python的次数不多。所以写这些也是照着大一上半年的c语言函数写的。目的是为了稍微稍微稍微的接触一下Python的一小些常用语句。欢迎大佬帮萌新斧正代码,或者补充一些小技巧小知识。
** 谢谢分享 当你遇到一个问题可以用正则表达式解决时,你就有了两个问题。{:301_983:} 谢谢楼主分享 谢谢分享 感谢分享
页:
[1]