首先思路是用正则表达式把有规则的word字符读取到python中,list或者数组之类的,然后再存到Excel中。因为是有规则的参考文献类的word所以难度不大,但是还是搞了一下午,最后只是凑合用,还有好多bug没有解。。。
import numpy as np
from docx import Document
import pandas as pd
from collections import OrderedDict
import csv
import re
doc = Document("CV1819last.docx")
for i, paragraph in enumerate(doc.paragraphs[:55]):
print(i, paragraph.text)
word中文件的格式如图,类似一个标准的参考文献格式,而我的需求是按照作者,论文名,期刊名,时间,期卷号存到一个excel中。
1.首先,word的python读取每次读的是块。
2.通过对格式的分析,确定了利用,来分割字符串,然后再用.来分割上次分割的第一个字符串,这对于期刊论文很适用,对于会议论文的可用性就弱很多。
3.数据的传递使用的是list而不是字典,如果有机会的话,可能字典更好用,只是时间有限。
完整代码如下
import numpy as np
from docx import Document
import pandas as pd
from collections import OrderedDict
import csv
import re
doc = Document("CV1819last.docx")
#for i, paragraph in enumerate(doc.paragraphs[:55]):
#print(i, paragraph.text)
# 保存最终的结构化数据
question_type2data = OrderedDict()
sum = np.zeros(shape=(15,8))
i = 0
Qiegelinesum1=[]
Qiegelinesum2=[]
# 从word文档开始遍历数据
for paragraph in doc.paragraphs[:67]:
# 将全角字符转半角字符,并给括号之间调整为中间一个空格
line = paragraph.text.replace(
"(", "(").replace(")", ")").replace(".", ".").replace(",", ",")
# 对于空白行就直接跳过
if not line:
continue
Qiegeline = []
#Qiegeline = re.split('\.|,', line)#同时切割.和,隔开的字符串
Qiegeline = line.rsplit(',', 2)#反向两个,隔开的
Qiegeline1 = Qiegeline[0].split('.', 2)
#取Qie1 list的第一个字符串,用.隔开
Qiegeline.remove(Qiegeline[0])
Qiegelinesum =Qiegeline1+Qiegeline
Qiegelinesum1.append(Qiegelinesum)
Qiegelinesum2 = Qiegelinesum1+Qiegelinesum
#sum[i][:]=Qiegelinesum1[[i]]+Qiegelinesum[[i]]
#将list保存为csv文件
#Qiegelinesum = list(map(list, zip(*Qiegelinesum)))
with open(r"friendInfo1.csv", 'w+', newline='') as file:#每次需要debug运行才可,在这个位置停一下再继续
writer = csv.writer(file)
writer.writerows(Qiegelinesum1)
切割字符串
str.split(sep, [,max])#,sep可以指定切割的符号,max可以指定切割的次数(次数不常用)
python自带的split
并且支持反向切割,str.rsplit()语法和正向一致
2.re库带的split,自认为的亮点是可以支持吧不同的符号作为切割位点,例如,
re.split('\.|,', line)#同时切割.和,隔开的字符串
正则表达式
正则表达式用反斜杠字符 ('') 表示特殊形式,或是允许在使用特殊字符时,不引发它们的特殊含义。
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配
检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)