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 相关文章推荐
python开发的小球完全弹性碰撞游戏代码
Oct 15 Python
Python操作MySQL数据库9个实用实例
Dec 11 Python
python 类详解及简单实例
Mar 24 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
python ansible服务及剧本编写
Dec 29 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
python实现数字炸弹游戏
Jul 17 Python
python mock测试的示例
Oct 19 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
php curl模拟post请求小实例
2013/11/13 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
json跟xml的对比分析
2008/06/10 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
简单了解python中的与或非运算
2019/09/18 Python
python如何支持并发方法详解
2020/07/25 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Python中pass的作用与使用教程
2020/11/13 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
致200米运动员广播稿
2014/02/06 职场文书
手机被没收的检讨书
2014/10/04 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书