我们在软件研发中不可避免的要用到大量的重复性的繁琐的工作,例如批量修改代码中接口的字符串,批量下载文件并重新按规则命名,这些工作人工做特别累,尤其是对我这种懒人来说。
对于一个出色的程序员来说,重复是最不能接受的事情之一,因此我们要发明工具把重复的工作自动化。以前我是用linux shell脚本来完成这些事情的,但由于shell脚本语法能力的限制,有些复杂功能无法有效快速的实现,并且写出的代码难以维护,基本属于一次性代码,很难复用。因此后面慢慢开始尝试用Python完成一些自动化脚本,由于Python语言强大的表现力和严格的书写规范,这些缺点都解决了!
最近打算把一些日常研发过程用的Python脚本逐步整理出来开源,于是就有了这个专题,希望能够帮助大家摆脱那些繁琐的工作。代码以最Pythonic的方式实现,工具代码会不断更新,项目git地址 https://github.com/offbye/TaoPyTools ,记得给star啊
今天先分析一个批量删除目录指定扩展名的文件中含指定字符串的行的脚本,这个脚本可以用来批量删除代码中的Log语句等。
#!/usr/bin/python2.7
# -*- encoding: UTF-8 -*-
# Copyright 2014 offbye
"""Delete lines contains some string form all expected extension files in path
批量删除目录指定扩展名的文件中含指定字符串的行
可以指定目录和文件扩展名
临时写的一个工具脚本,与App生成系统无关
Usage: python delstr_path.py -p YOUR_PATH -e FILE_EXTENSION -s CONTAIN_STRING_WANT_TO_DELETE
"""
__author__ = ['"Xitao":<offbye@gmail.com>']
import sys
import os
import shutil
import getopt
def delstr_path(p, findstr, suffix='js'):
# 传递路径及两个字符串作为参数
workdir = p
os.chdir(workdir)
cwd = os.getcwd()
dirs = os.listdir(cwd)
for tmp in dirs:
path = os.path.join(cwd, tmp)
#print 'path=', path
#如果是文件
if os.path.isfile(path):
#判断文件扩展名
if os.path.splitext(tmp)[1][1:] == suffix:
tmp_name = path + '.bak'
tmp_file = open(tmp_name, "w")
with open(path) as f:
lines = f.readlines()
for line in lines:
# 如果包含字符串则跳过,否则写入临时文件
if line.find(findstr) > -1:
continue
tmp_file.write(line)
tmp_file.close()
# 使用新文件替换原文件
shutil.move(tmp_name, path)
#如果是路径,递归
elif os.path.isdir(path):
print("Enter dir: " + path)
delstr_path(path, findstr)
if __name__ == "__main__":
print("delele contains str in path")
opts, args = getopt.getopt(sys.argv[1:], "hp:e:s:")
path = ''
find_str = ''
extension = ''
for op, value in opts:
if op == "-p": # 获取路径
path = value
elif op == "-e": # 获取路径
extension = value
elif op == "-s":
find_str = value
print("Delete lines contains {0} form all {1} files in path {2} ".format(find_str, extension, path))
delstr_path(path, find_str, extension)
sys.exit()
elif op == "-h":
print("Usage: python delstr_path.py -p YOUR_PATH -e FILE_EXTENSION -s CONTAIN_STRING_WANT_TO_DELETE")
sys.exit()