香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > python >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

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


时间:2021-12-08 14:52 作者:admin


本文实例讲述了python/' target='_blank'>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 replacingv0.1 - initial version  Useable by a small "client" script, e.g.:-------------------------------------------------------------------------------#!/usr/bin/python -O# coding: UTF-8import sys, re#sys.path.insert(0,"/path/to/git/repro/") # Please change pathfrom replace_in_files import SearchAndReplaceSearchAndReplace(  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-pythonRE_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程序设计有所帮助。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)