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中用format函数格式化字符串的用法
Apr 08 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
Django卸载之后重新安装的方法
Mar 15 Python
Python通过future处理并发问题
Oct 17 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Python错误处理操作示例
Jul 18 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
QML使用Python的函数过程解析
Sep 26 Python
Python实现检测文件的MD5值来查找重复文件案例
Mar 12 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
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
jquery cookie插件代码类
2009/05/26 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
关于vue-resource报错450的解决方案
2017/07/24 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
实例详解Python模块decimal
2019/06/26 Python
python自动识别文本编码格式代码
2019/12/26 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
函授自我鉴定范文
2014/02/06 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
交通事故起诉书
2015/05/19 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python