python学习笔记 - 如何从几千个文件中寻找出指定的内容

今天在处理数据时遇到这么个问题,如何从几千个txt文件中找到我想要的内容呢?

这是我的实现思路。

  1. 读取文件
  2. 选中指定的内容段
  3. 在新路径下保存内容段并命名为之前的文件名

以下是用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')
    
    
    
    
    

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值