今天在处理数据时遇到这么个问题,如何从几千个txt文件中找到我想要的内容呢?
这是我的实现思路。
- 读取文件
- 选中指定的内容段
- 在新路径下保存内容段并命名为之前的文件名
以下是用python实现的代码。有详细注释!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import re
regtxt = r'.+?\.txt' #扫描对象为txt文件.
regcontenthead = r'<!-- ========== METHOD SUMMARY =========== -->' #找出指定的开头
regcontentend = r'</table>' #找到指定的结尾
class FileException(Exception):
pass
def getdirlist(filepath):
"""获取目录下所有的文件."""
txtlist = [] #文件集合.
txtre = re.compile(regtxt)
needfile = [] #存放结果.
for parent, listdir, listfile in os.walk(filepath):
for files in listfile:
#获取所有文件.
istxt = re.findall(txtre, files)
filecontext = os.path.join(parent, files)
#获取非空的文件.
if istxt :
txtlist.append(filecontext)
#将所有的数据存放到needfile中.
needfile.append(readfile(filecontext))
#print('needflie:', needfile)
if needfile == []:
raise FileException("no file can be find!")
else:
#print('needfile:',needfile)
validatedata = getvalidata(needfile)
#print ('validatedata', validatedata)
print ('total file %s , validate file %s.' %(len(txtlist),len(validatedata)))
def getvalidata(filelist=[]):
"""过滤集合中空的元素."""
valifile = []
for fp in filelist:
if fp != None:
valifile.append(fp)
return valifile
def readfile(filepath):
"""通过正则匹配文本中内容,并返回文本."""
flag = False
contentrehead = re.compile(regcontenthead) #regcontenthead = r'<!-- ========== METHOD SUMMARY =========== -->'
contentrend = re.compile(regcontentend)
fp = open(filepath, 'r', encoding='UTF-8')
str1 = "LCP_Read"
str2 = "LCP_Write"
Newfilepath = filepath.replace(str1, str2) #保存到新的路径
fpWrite = open(Newfilepath, "a+")
lines = fp.readlines()
#print('lines:', lines)
flines = len(lines)
#print('flines:', flines)
#逐行匹配数据.
for i in range(flines):
iscontenthead = re.findall(contentrehead, lines[i])
j = i
if iscontenthead:
for j in range(flines):
if j < i:
continue
else:
iscontentend = re.findall(contentrend, lines[j])
fpWrite.write(lines[j]) #把指定的内容写入文件
if iscontentend:
fp.close()
fpWrite.close()
#print('filepath', filepath)
return filepath
if __name__ == "__main__":
getdirlist('C:\\Users\\Dandelion\\Desktop\\LCP_Read')