python 多线程 基于正则表达式的多线程文本替换功能实现

#!/usr/bin/env python

import os
import os.path
import sys
import re
import shutil
import csv
from multiprocessing import Pool #support muti thread map reduce function

specialChars = [‘.‘, ‘^‘ , ‘$‘, ‘*‘, ‘+‘, ‘?‘ ,‘\\‘, ‘[‘, ‘]‘, ‘|‘, ‘(‘, ‘)‘ ]

g_max_thread_pool_size = 30#max thread pool size

def dealSpecialChars(str):
    s = ‘‘
    for c in str:
        if c in specialChars:
            s = s + (‘[‘ + c + ‘]‘)
        else:
            s = s+c
    return s

def readDictsFromCsv(filePath):
    #print filePath
    dicts = dict()
    with open(filePath, ‘rb‘) as csvfile:
        dictsReader = csv.DictReader(csvfile, fieldnames=[‘srcName‘, ‘newName‘], restkey=None, delimiter=‘,‘, quotechar=‘|‘)
        for d in dictsReader:
            #dicts[dealSpecialChars(d[‘srcName‘])] = d[‘newName‘]
            dicts[d[‘srcName‘]] = d[‘newName‘]
    return dicts

BinaryExtList = [‘.bmp‘, ‘.avi‘, ‘.res‘, ‘.xls‘, ‘.doc‘, ‘.dll‘, ‘.lib‘, ‘.bpl‘, ‘.exe‘, ‘.chm‘]

replaceDicts = {r"RNC820V400R008C00SPC500": r"93" }  

def ApplyReplace(str, keys, replaceDicts):
    ret = str
    for pattern in keys:
        try:
            ret = re.sub(pattern, replaceDicts[pattern], ret)
        except:
            print "Unexpected error ApplyReplace(str, keys, replaceDicts):",str,
        finally:
            print  str, ret
    return ret

def NeedReplace(str, keys):
    for pattern in keys:
        #print pattern, str
        try:
            if re.search(pattern, str):
                return True
        except:
            print "Unexpected error NeedReplace(str, keys):",str, ‘:‘
    return False

defaultExtList = [‘.txt‘, ‘.xml‘]
def findFile(srcDir, filter = None):
    if(filter == None):
        filter = defaultExtList
    filelist = []
    for name in os.listdir(srcDir):
        fullPath = srcPath + ‘\\‘ + name
        if os.path.isdir(fullPath):
            filelist.append(findFile(fullPath))
        else:
            if os.path.splitext(fullPath)[1].lower() in filter:
                filelist.append(fullPath)

    return filelist

def ReplaceAllStrInFile(file, dicts, keys, filter = defaultExtList):
    print ‘ReplaceAllStrInFile:file-‘,file, ‘begin!‘

    for key in keys:
        print key, dicts[key]#for test
    fullPath = file
    if os.path.splitext(fullPath)[1].lower() not in filter:
        return
    #print ‘convert file:‘, fullPath
    try:
        srcFile = open(fullPath, ‘r‘)
        tempfile = fullPath+‘temp‘
        destFile = open(tempfile, ‘w‘)
        needRewrite = False
        try:
            for line in srcFile:
                if NeedReplace(line, keys):
                    line = ApplyReplace(line, keys, dicts)
                destFile.write(line)
            srcFile.close()
            destFile.close()
            os.remove(fullPath)
            os.rename(tempfile, fullPath)
            print ‘convert file:‘, fullPath, ‘success!‘
        except:
            print ‘convert file:‘, fullPath, ‘failed!‘
            srcFile.close()
            destFile.close()
            os.remove(tempfile)

    except:
        print ‘convert file:‘, fullPath, ‘failed!‘
        return False
    return True

def ReplaceAllStrInFileByRows(srcfile, csvfilePath, maxRow = 10):
    if maxRow < 1:
        return false
    dicts = readDictsFromCsv(csvfilePath)
    keys=(sorted(dicts.keys(), key=lambda key: len(key), reverse=True))#reverse keys by elements‘ length
    length = len(keys)
    rows = range(length/maxRow + 1)
    for i in rows:
        ReplaceAllStrInFile(srcfile, dicts, keys[(i*maxRow):(i+1)*maxRow])
        print ‘ ‘.join(keys[(i*maxRow):(i+1)*maxRow])

def f(x):
    return ReplaceAllStrInFileByRows(x[0], x[1])

if __name__ == "__main__":
    args = sys.argv
    if len(args) <> 3:
        print ‘‘‘
        usage: python testcsv.py D:\ss\temp.csv D:\ss\test        ‘‘‘
        exit
    csvfilePath = args[1]
    srcPath = args[2]

    filelist = findFile(srcPath)
    #print filelist, len(filelist)

    dataItems = []
    for file in filelist:
        dataItems.append([file, csvfilePath])
    #ReplaceAllStrInFileByRows(dataItems[0][0], dataItems[0][1])
    pool_size = g_max_thread_pool_size
    if len(filelist) < g_max_thread_pool_size:
        pool_size = len(filelist)
    pool = Pool(processes=pool_size)#muti thread

    pool.map(f, dataItems)
    #print result.get(timeout=10)
    #pool.map
时间: 2024-11-06 02:55:58

python 多线程 基于正则表达式的多线程文本替换功能实现的相关文章

基于Python的urllib2模块的多线程网络爬虫程序

1 m Queue import Queue 2 from gzip import GzipFile 3 from StringIO import StringIO 4 import time 5 import socket 6 class ContentEncodingProcessor(urllib2.BaseHandler): 7 """A handler to add gzip capabilities to urllib2 requests ""

MySQL主从复制&mdash;&mdash;MySQL-5.6基于GTID及多线程的复制

一.Mysql 5.6 新特性 .... 复制功能的改进 ⒈支持多线程复制,(slave-parallel-workers=0     0: 表示禁用多线程功能:)事实上是针对每个database开启相应的独立线程.即每个库有一个单独的(sql thread),如果线上业务中,只有一个database或者绝大多数压力集中在个别database的话,多线程并发复制特性就没有意义了. ⒉支持启用GTID,对运维人员来说应该是一件令人高兴的事情,在配置主从复制,传统的方式里,你需要找到binlog和P

Linux-6.5下 基于MariaDB-10 GTID多线程 的配置解析

                            mysql 5.6 基于 gtid 主从复制(本文是:MariaDB-10) MySQL 5.6引入的GTID(Global Transaction IDs)使得其复制功能的配置.监控及管理变得更加易于实现,且更加健壮. GTID是一个 unique 唯一的表示符,他是由服务器的uuid 全局唯一标示,是由128位的随机符组成,mysql-5.6是依靠server-id和uuid 来标示复制架构中的每一个主机,因为是128位的随机字符串在全

Python爬虫进阶五之多线程的用法

前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread 库,一个是 multiprocessing 库.而多线程 thread 在 Python 里面被称作鸡肋的存在!而没错!本节介绍的是就是这个库 thread. 不建议你用这个,不过还是介绍下了,如果想看可以看看下面,不想浪费时间直接看 multiprocessing 多进程 鸡肋点 名言: "Pyt

python ssh弱口令爆破多线程脚本及遇到的一些错误与问题

练习写了个SSH弱口令爆破多线程脚本,遇到的问题 1.一开始想import pexpect 中的pxssh 然而却一直该有错误, ImportError: cannot import name spawn google了下问题都说的很模糊也不清楚.有的说是pexpect模块没安装好,有的说是python import的问题,因为在lib中已经有了spawn模块,与pexpect模块中的spawn重名了,所以报错.但也都没说清楚该这么弄.最后在here这里看到了问题原因,原来是pexpect根本不

mysql复制原理/基于库的多线程复制原理/基于BLGC的多线程复制原理

单线程主从复制: 从库向主库请求binlog,并将binlog转存到自己的relaylog中,从库重做binlog里面的sql, 主要由以下三个线程完成. dump thread: 在主库上,发送binlog io thread: 在slave上,接收,转存,请求binlog sql thread :在slave 上,重做binlog 基于库的多线程复制原理: 从库向主库请求binlog,并将binlog转存到自己的relaylog中,从库重做binlog里面的sql, 主要由以下三个线程完成.

Thead线程篇之-----多线程 实现 有返回值的功能

import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class MyCallBack implements Callable<String>{ private String threadName; public MyCallBack() { } public MyCallBack(S

Python使用TCPServer编写(多线程)Socket服务

SocketServer包对socket包进行了包装(封装),使得创建socket服务非常简单. TCPServer+BaseRequestHandler 使用TCPServer和BaseRequestHandler编写socket服务的样例. #-*- coding:utf-8 -*- from SocketServer import TCPServer, BaseRequestHandler import traceback class MyBaseRequestHandlerr(BaseR

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要