python实现修改固定模式的字符串内容操作示例


Posted in Python onDecember 30, 2019

本文实例讲述了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!")

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
Python解析nginx日志文件
May 11 Python
python利用urllib和urllib2访问http的GET/POST详解
Sep 27 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
python 自定义对象的打印方法
Jan 12 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
Python魔术方法专题
Jun 19 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
如何通过python计算圆周率PI
Nov 11 Python
详解Python中的Lock和Rlock
Jan 26 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 #Python
Django框架之中间件MiddleWare的实现
Dec 30 #Python
Django 路由层URLconf的实现
Dec 30 #Python
python解析多层json操作示例
Dec 30 #Python
pytorch 求网络模型参数实例
Dec 30 #Python
利用python3 的pygame模块实现塔防游戏
Dec 30 #Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 #Python
You might like
thinkphp四种url访问方式详解
2014/11/28 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现的简单算术游戏实例
2015/05/26 Python
Python安装第三方库的3种方法
2015/06/21 Python
Python使用OpenCV进行标定
2018/05/08 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
基于python plotly交互式图表大全
2019/12/07 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
上学迟到的检讨书
2014/01/11 职场文书
公司口号大全
2014/06/11 职场文书
2015年校长新年寄语
2014/12/08 职场文书
质检员岗位职责范本
2015/04/07 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
户外拓展训练感想
2015/08/07 职场文书
2016年十一促销广告语
2016/01/28 职场文书
标准发言稿结尾
2019/07/18 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python