python实现的用于搜索文件并进行内容替换的类实例


Posted in Python onJune 28, 2015

本文实例讲述了python实现的用于搜索文件并进行内容替换的类。分享给大家供大家参考。具体实现方法如下:

#!/usr/bin/python -O
# coding: UTF-8
"""
-replace string in files (recursive)
-display the difference.
v0.2
 - search_string can be a re.compile() object -> use re.sub for replacing
v0.1
 - initial version
  Useable by a small "client" script, e.g.:
-------------------------------------------------------------------------------
#!/usr/bin/python -O
# coding: UTF-8
import sys, re
#sys.path.insert(0,"/path/to/git/repro/") # Please change path
from replace_in_files import SearchAndReplace
SearchAndReplace(
  search_path = "/to/the/files/",
  # e.g.: simple string replace:
  search_string = 'the old string',
  replace_string = 'the new string',
  # e.g.: Regular expression replacing (used re.sub)
  #search_string = re.compile('{% url (.*?) %}'),
  #replace_string = "{% url '\g<1>' %}",
  search_only = True, # Display only the difference
  #search_only = False, # write the new content
  file_filter=("*.py",), # fnmatch-Filter
)
-------------------------------------------------------------------------------
:copyleft: 2009-2011 by Jens Diemer
"""
__author__ = "Jens Diemer"
__license__ = """GNU General Public License v3 or above -
 http://www.opensource.org/licenses/gpl-license.php"""
__url__ = "http://www.jensdiemer.de"
__version__ = "0.2"
import os, re, time, fnmatch, difflib
# FIXME: see http://stackoverflow.com/questions/4730121/cant-get-an-objects-class-name-in-python
RE_TYPE = type(re.compile(""))
class SearchAndReplace(object):
  def __init__(self, search_path, search_string, replace_string,
                    search_only=True, file_filter=("*.*",)):
    self.search_path = search_path
    self.search_string = search_string
    self.replace_string = replace_string
    self.search_only = search_only
    self.file_filter = file_filter
    assert isinstance(self.file_filter, (list, tuple))
    # FIXME: see http://stackoverflow.com/questions/4730121/cant-get-an-objects-class-name-in-python
    self.is_re = isinstance(self.search_string, RE_TYPE)
    print "Search '%s' in [%s]..." % (
      self.search_string, self.search_path
    )
    print "_" * 80
    time_begin = time.time()
    file_count = self.walk()
    print "_" * 80
    print "%s files searched in %0.2fsec." % (
      file_count, (time.time() - time_begin)
    )
  def walk(self):
    file_count = 0
    for root, dirlist, filelist in os.walk(self.search_path):
      if ".svn" in root:
        continue
      for filename in filelist:
        for file_filter in self.file_filter:
          if fnmatch.fnmatch(filename, file_filter):
            self.search_file(os.path.join(root, filename))
            file_count += 1
    return file_count
  def search_file(self, filepath):
    f = file(filepath, "r")
    old_content = f.read()
    f.close()
    if self.is_re or self.search_string in old_content:
      new_content = self.replace_content(old_content, filepath)
      if self.is_re and new_content == old_content:
        return
      print filepath
      self.display_plaintext_diff(old_content, new_content)
  def replace_content(self, old_content, filepath):
    if self.is_re:
      new_content = self.search_string.sub(self.replace_string, old_content)
      if new_content == old_content:
        return old_content
    else:
      new_content = old_content.replace(
        self.search_string, self.replace_string
      )
    if self.search_only != False:
      return new_content
    print "Write new content into %s..." % filepath,
    try:
      f = file(filepath, "w")
      f.write(new_content)
      f.close()
    except IOError, msg:
      print "Error:", msg
    else:
      print "OK"
    print
    return new_content
  def display_plaintext_diff(self, content1, content2):
    """
    Display a diff.
    """
    content1 = content1.splitlines()
    content2 = content2.splitlines()
    diff = difflib.Differ().compare(content1, content2)
    def is_diff_line(line):
      for char in ("-", "+", "?"):
        if line.startswith(char):
          return True
      return False
    print "line | text\n-------------------------------------------"
    old_line = ""
    in_block = False
    old_lineno = lineno = 0
    for line in diff:
      if line.startswith(" ") or line.startswith("+"):
        lineno += 1
      if old_lineno == lineno:
        display_line = "%4s | %s" % ("", line.rstrip())
      else:
        display_line = "%4s | %s" % (lineno, line.rstrip())
      if is_diff_line(line):
        if not in_block:
          print "..."
          # Display previous line
          print old_line
          in_block = True
        print display_line
      else:
        if in_block:
          # Display the next line aber a diff-block
          print display_line
        in_block = False
      old_line = display_line
      old_lineno = lineno
    print "..."
if __name__ == "__main__":
  SearchAndReplace(
    search_path=".",
    # e.g.: simple string replace:
    search_string='the old string',
    replace_string='the new string',
    # e.g.: Regular expression replacing (used re.sub)
    #search_string  = re.compile('{% url (.*?) %}'),
    #replace_string = "{% url '\g<1>' %}",
    search_only=True, # Display only the difference
#    search_only   = False, # write the new content
    file_filter=("*.py",), # fnmatch-Filter
  )

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

Python 相关文章推荐
Python类定义和类继承详解
May 08 Python
python动态性强类型用法实例
May 09 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
python实现海螺图片的方法示例
May 12 Python
详解Python3 pandas.merge用法
Sep 05 Python
python监控nginx端口和进程状态
Sep 06 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
python微信公众号开发简单流程实现
Mar 09 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
python实现简单ftp客户端的方法
Jun 28 #Python
基于进程内通讯的python聊天室实现方法
Jun 28 #Python
python实现的简单RPG游戏流程实例
Jun 28 #Python
python实现自动登录人人网并采集信息的方法
Jun 28 #Python
Python实现将绝对URL替换成相对URL的方法
Jun 28 #Python
python实现将html表格转换成CSV文件的方法
Jun 28 #Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 #Python
You might like
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
写的htc的数据表格
2007/01/20 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
判断网页编码的方法python版
2016/08/12 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
如何进行Linux分区优化
2016/09/13 面试题
一年级班主任感言
2014/03/08 职场文书
运动会加油口号
2014/06/07 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库