BIGOcean 发表于 2020-7-6 14:47

【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的一小些常用语句。欢迎大佬帮萌新斧正代码,或者补充一些小技巧小知识。
**

qhczdy 发表于 2020-7-6 15:13

谢谢分享

BIGOcean 发表于 2020-7-6 15:29

当你遇到一个问题可以用正则表达式解决时,你就有了两个问题。{:301_983:}

kenjsyg 发表于 2020-7-6 16:08

谢谢楼主分享

hj170520 发表于 2020-7-6 23:08

谢谢分享

mikeee 发表于 2020-7-6 23:18

感谢分享
页: [1]
查看完整版本: 【Python】批量获取多个docx文档中特定段落源码