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 相关文章推荐
在Django的通用视图中处理Context的方法
Jul 21 Python
小小聊天室Python代码实现
Aug 17 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
Python自定义线程类简单示例
Mar 23 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
python多线程与多进程及其区别详解
Aug 08 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python与pycharm有何区别
Jul 01 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
如何用Python进行时间序列分解和预测
Mar 01 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
建立动态的WML站点(一)
2006/10/09 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
实例讲解python中的协程
2018/10/08 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
为什么会有内存对齐
2016/10/10 面试题
三好学生演讲稿范文
2014/04/26 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
未中标通知书
2015/04/17 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
Redis三种集群模式详解
2021/10/05 Redis
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL