python实现的用于搜索文件并进行内容替换的类实例
本文实例讲述了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程序设计有所帮助。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

VS Code可以在Windows 8上运行,但体验可能不佳。首先确保系统已更新到最新补丁,然后下载与系统架构匹配的VS Code安装包,按照提示安装。安装后,注意某些扩展程序可能与Windows 8不兼容,需要寻找替代扩展或在虚拟机中使用更新的Windows系统。安装必要的扩展,检查是否正常工作。尽管VS Code在Windows 8上可行,但建议升级到更新的Windows系统以获得更好的开发体验和安全保障。

VS Code 可用于编写 Python,并提供许多功能,使其成为开发 Python 应用程序的理想工具。它允许用户:安装 Python 扩展,以获得代码补全、语法高亮和调试等功能。使用调试器逐步跟踪代码,查找和修复错误。集成 Git,进行版本控制。使用代码格式化工具,保持代码一致性。使用 Linting 工具,提前发现潜在问题。

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

在 VS Code 中,可以通过以下步骤在终端运行程序:准备代码和打开集成终端确保代码目录与终端工作目录一致根据编程语言选择运行命令(如 Python 的 python your_file_name.py)检查是否成功运行并解决错误利用调试器提升调试效率

VS Code 扩展存在恶意风险,例如隐藏恶意代码、利用漏洞、伪装成合法扩展。识别恶意扩展的方法包括:检查发布者、阅读评论、检查代码、谨慎安装。安全措施还包括:安全意识、良好习惯、定期更新和杀毒软件。
