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应用程序在windows下不出现cmd窗口的办法
May 29 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
Django CBV类的用法详解
Jul 26 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Python字典和列表性能之间的比较
Jun 07 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的password_hash()使用实例
2014/03/17 PHP
PHP面向对象精要总结
2014/11/07 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
纯javascript实现分页(两种方法)
2015/08/26 Javascript
Underscore源码分析
2015/12/30 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
python实现一次创建多级目录的方法
2015/05/15 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
详解Python中第三方库Faker
2020/09/25 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
决心书标准格式
2014/03/11 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang
Go Plugins插件的实现方式
2021/08/07 Golang
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript