要求:
1,遍历文件夹下所有的.xml文件
2,从.xml文件中提取关键字以及左右十个字符
3,输出到excel
一:遍历文件夹找到所有xml文件及其路径
for root, dirs, files in os.walk(self.inputFilePath):
for file in files:
targetFilePath = os.path.join(root, file)
if not targetFilePath.endswith(".xml"):
continue
xmlFileData = open(targetFilePath,'r',encoding='utf-8').read()
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情
def walk(top, topdown=True, onerror=None, followlinks=False):
参数解释:
- top – 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
- topdown的默认值是“True”,表示首先返回根目录树下的文件,然后遍历目录树下的子目录。值设为False时,则表示先遍历目录树下的子目录,返回子目录下的文件,最后返回根目录下的文件。
- topdown设值不同,os.walk()返回的列表元素顺序不同(但不是相反),所以遍历后的结果也不同
- onerror – 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。
- followlinks – 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。
我们只传入一个目录参数,它会遍历当前目录,及其子目录。
返回的是一个三元组(root,dirs,files)
- root 所指的是当前正在遍历的这个文件夹的本身的地址
- dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
- files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
二:对xml文件提取关键字及其左右的十个字符
xmlFileData = open(targetFilePath,'r',encoding='utf-8').read()
for m in re.finditer(self.keyWords, xmlFileData, re.I):#re.I标志是大小写不敏感
extractKeywords = xmlFileData[m.start()-OFFSET:m.end()+OFFSET]
self.keywordInfoList.append((targetFilePath,extractKeywords))
用到了re模块的finditer方法,用过re模块的相信都用过findall()方法,该方法能一次性找出所有的正则匹配结果,但是也有局限性,其不能提供所在的位置,并且是一起返回的,如果有数万个一起返回来,就不太好处理了,因此要使用finditer()函数来实现每次只返回一个,并且返回所在的位置。
re.finditer(pattern, string, flags=0)
参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志 |
针对re.finditer返回的迭代对象,每一个迭代子对象都有start和end方法,start定位到关键字开始的位置,end定位到关键字结尾的位置,我们再定义一个偏移值(建议用宏,可以统一修改)来提取关键字及其左右偏移的字符
三:写入excel
def writeToExcel(self):
workBook = openpyxl.Workbook()
sheetPos = 0
for ele in self.keywordInfoList:
oneLine = list()
rootPathSplit = ele[0].split('\\')
firstDirIndex = rootPathSplit.index(self.firstDirName)#获取当前目录的索引
newSheet = rootPathSplit[firstDirIndex+1]
if newSheet not in workBook.sheetnames:
workSheet = workBook.create_sheet(newSheet, sheetPos)
sheetPos += 1
oneLine.extend(rootPathSplit[firstDirIndex+1:])
oneLine.append(ele[1])
workSheet.append(oneLine)
print(oneLine)
workBook.save("xmlExtractKeyword.xlsx")
用到了openpyxl模块,下面给出常用的方法
创建:
from openpyxl import Workbook
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active
打开已有:
from openpyxl import load_workbook
wb2 = load_workbook('文件名称.xlsx')
储存数据:
# 方式一:数据可以直接分配到单元格中(可以输入公式)
ws['A1'] = 42
# 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
# 方式三:Python 类型会被自动转换
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
创建表(sheet):
# 方式一:插入到最后(default)
>>> ws1 = wb.create_sheet("Mysheet")
# 方式二:插入到最开始的位置
>>> ws2 = wb.create_sheet("Mysheet", 0)
选择表(sheet):
# sheet 名称可以作为 key 进行索引
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True
查看表名(sheet):
# 显示所有表名
>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
# 遍历所有表
>>> for sheet in wb:
... print(sheet.title)
更多方法请见:python-- openpyxl详解_像风一样的男人@的博客-CSDN博客