python--修改固定模式的字符串的内容

说明

字符串模式是开头可能有空格,之后可能存在多个小数点,然后后面跟着一个数字,数字可能是小数,数字后可能存在空格。
任务要求删去开头的小数点,如下:

" …78 " 修改为" 78 "
" …7.889 " 修改为" 7.889 "
“.9.8"修改为"9.8”

代码示例

注意这里正则的模式和分组的用法

import os
import re

testStr=r"...7.88 "
pattern=re.compile(r'(?P<lblank> *)(?P<point>\.*)(?P<realcontent>\d+\.?\S*)(?P<rblank> *)')

finalStr=pattern.search(testStr)
print(finalStr)

result=finalStr.group("lblank")+finalStr.group("realcontent")+finalStr.group("rblank")
print("result is: {}".format(result))

输出:

<_sre.SRE_Match object; span=(0, 8), match='...7.88 '>
result is: 7.88

拓展

说明

用来处理样本用的。标签是一个txt文件包含了图片的内容,内容的模式是(空格*)+(.*)+(小数或者整数)+(空格凑齐位数)。
脚本实现功能是:将第二部分里面的小数点去除(用正则分组去),修正原本的标签文件,并将标签两边占位用的空格去掉,形成新的标签,将新标签文件和对应的图片移动到以标签长度命名的文件夹中。由于文件量有40w+,使用多进程处理。

拓展代码

import os
import re
from multiprocessing import Pool
import shutil

def getAllFilePath(pathFolder,filter=[".jpg",".txt"]):
    #遍历文件夹下所有图片
    allCropPicPathList=[]
    allTXTPathList=[]
    #maindir是当前搜索的目录 subdir是当前目录下的文件夹名 file是目录下文件名
    for maindir,subdir,file_name_list in os.walk(pathFolder):
        for filename in file_name_list:
            apath=os.path.join(maindir,filename)
            ext=os.path.splitext(apath)[1]#返回扩展名
            if ext==filter[0] and ('_crop' in filename):
                allCropPicPathList.append(apath)
            elif ext==filter[1] and ('_crop' in filename):
                allTXTPathList.append(apath)
    return list(zip(allCropPicPathList,allTXTPathList))

#分析样本 对模式错误(即删去在开头空格和数字之间的.)的进行修正
def checkTxtContent(txtcontent,txtPath):
    pattern=re.compile(r'(?P<lblank> *)(?P<point>\.*)(?P<realcontent>\d+\.?\S*)(?P<rblank> *)')
    finalStr=pattern.search(txtcontent)
    if len(finalStr.group("point"))!=0:
        resultStr=finalStr.group("lblank")+finalStr.group("realcontent")+finalStr.group("rblank")
        with open(txtPath,'w') as fw:
            fw.write(resultStr)
        with open(r'E:\Numberdata\wrong.txt','a') as fw:
            fw.write(txtPath+"\n")  
        print(txtPath,"is wrong!")
        return resultStr
    else:
        return txtcontent

#移动图片到对应长度的文件夹  标签label进行修改
def dealSampleList(samplePathList,saveBaseDir):
    for samplePath in samplePathList:
        txtPath=samplePath[1]
        picPath=samplePath[0]
        newtxtStr=""
        with open(txtPath,'r') as fr:
            txtStr=fr.readline()
            newtxtStr=checkTxtContent(txtStr,txtPath)
            newtxtStr=newtxtStr.strip()
        # 创建对应的文件夹
        saveDir=os.path.join(saveBaseDir,str(len(newtxtStr)))
        if not os.path.exists(saveDir):
            os.mkdir(saveDir)
        newTxtName=os.path.basename(txtPath)
        newPicName=os.path.basename(picPath)
        with open(os.path.join(saveDir,newTxtName),'w') as fw:
            fw.write(newtxtStr)  
        shutil.move(picPath,os.path.join(saveDir,newPicName))
        # print(newPicName,'is done!')

       
if __name__ =='__main__':
    allFilePath=getAllFilePath(r'E:\Numberdata\4')
    # dealSampleList(allFilePath,r'E:\Numberdata\data')
    n_total=len(allFilePath)
    n_process=4 #8线程

    #每段子列表长度
    length=float(n_total)/float(n_process)
    indices=[int(round(i*length)) for i in range(n_process+1)]

    sublists=[allFilePath[indices[i]:indices[i+1]] for i in range(n_process)]

    #生成进程池  
    p=Pool(n_process)
    for i in sublists:
        print("sublist len is {}".format(len(i)))
        p.apply_async(dealSampleList, args=(i,r'E:\Numberdata\data'))
    p.close()
    p.join()
    print("All done!")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值