|
说明
使用Python的字符串处理和正则表达式处理实现了一个删除C/C++源程序中所有注释和空行的小脚本。
使用字符串处理
1: # delete all the comments and empty line of a C/C++ source file 2: import os, sys,string 3: 4: #------------------------------------------------------------- 5: def usage(): 6: print u''' 7: help: del_comment.py 8: ''' 9: #-------------------------------------------------------------- 10: def deal_file(src): 11: # file exist or not 12: if not os.path.exists(src): 13: print 'Error: file - %s doesn\'t exist.'% src 14: return False 15: if os.path.islink(src): 16: print 'Error: file - %s is a link.' 17: return False 18: filetype = (os.path.splitext(src))[1] 19: if not filetype in ['.c','.h','.cpp','.hh','.cc']: 20: return False 21: try: 22: if not os.access(src, os.W_OK): 23: os.chmod(src, 0664) 24: except: 25: print 'Error: you can not chang %s\'s mode.'% src 26: 27: inputf = open(src, 'r') 28: outputfilename = (os.path.splitext(src))[0] + '_no_comment'+filetype 29: outputf = open(outputfilename, 'w') 30: 31: try: 32: #-----find /*.....*/ 33: rFlag=0 34: line=inputf.readline() 35: while(line): 36: fm=string.find(line,'/*') 37: if fm!=-1: # find a /* 38: if fm>1:# not empty line 39: outputf.write(line[:fm]+'\n') 40: rFlag=1 41: # find */ 42: fm=string.find(line,'*/') 43: if fm!=-1: 44: rFlag=0 45: else: 46: line=inputf.readline() 47: while line: 48: fm=string.find(line,'*/') 49: if fm!=-1: 50: rFlag=0 51: break 52: line=inputf.readline() 53: if not line: 54: print 'Match /*...*/ error' 55: else: # deal with // 56: fm=string.find(line,'//') 57: if fm==-1: 58: if len(line)>1: # not empty line 59: outputf.write(line) 60: elif fm!=-1 and (not rFlag): 61: if fm>1: # not empty line 62: outputf.write(line[:fm]+'\n') 63: #read nextline 64: line=inputf.readline() 65: except: 66: print 'Error: unexcept error.' 67: inputf.close() 68: outputf.close() 69: return True 70: 71: #-------------------------------------------------------------- 72: def deal_dir(src): 73: # dir exist or not 74: if not os.path.exists(src): 75: print 'Error: dir - %s is not exist.'%s (src) 76: return False 77: filelists = os.listdir(src) 78: for eachfile in filelists: 79: eachfile = src + '/' +eachfile 80: if os.path.isdir(eachfile): 81: deal_dir(eachfile) 82: elif os.path.isfile(eachfile): 83: deal_file(eachfile) 84: return True 85: 86: #-------------------------------------------------------------- 87: def main(): 88: if len(sys.argv) < 2: 89: usage() 90: sys.exit(1) 91: src = sys.argv[1] 92: # get absolute dir/file path 93: if os.path.isdir(src): 94: dire = os.path.abspath(src) 95: dirFlag = True 96: elif os.path.isfile(src): 97: fl = os.path.abspath(src) 98: dirFlag = False 99: else: 100: print 'File input error' 101: 102: # deal 103: if dirFlag: 104: deal_dir(dire) 105: else: 106: deal_file(fl) 107: print 'Successful handle file.' 108: 109: #-------------------------------------------------------------- 110: if __name__ == '__main__': 111: main()
使用正则表达式
1: # delete all the comments and empty line of a C/C++ source file 2: import os, sys,string,re,glob 3: 4: # /*..*/ //... 5: Rule1 = "(\/\*(\s|.)*?\*\/)|(\/\/.*)" 6: c1=re.compile(Rule1) 7: 8: #------------------------------------------------------------- 9: def usage(): 10: print u''' 11: help: del_comment.py 12: ''' 13: #-------------------------------------------------------------- 14: def deal_file(src): 15: # file exist or not 16: if not os.path.exists(src): 17: print 'Error: file - %s doesn\'t exist.'% src 18: return False 19: if os.path.islink(src): 20: print 'Error: file - %s is a link.' 21: return False 22: filetype = (os.path.splitext(src))[1] 23: if not filetype in ['.c','.h','.cpp','.hh','.cc']: 24: return False 25: try: 26: if not os.access(src, os.W_OK): 27: os.chmod(src, 0664) 28: except: 29: print 'Error: you can not chang %s\'s mode.'% src 30: 31: inputf = open(src, 'r') 32: outputfilename = (os.path.splitext(src))[0] + '_no_comment'+filetype 33: outputf = open(outputfilename, 'w') 34: 35: lines=inputf.read() 36: inputf.close() 37: lines=re.sub(Rule1,"",lines) 38: outputf.write(lines) 39: outputf.close() 40: return True 41: 42: #-------------------------------------------------------------- 43: def deal_dir(src): 44: # dir exist or not 45: if not os.path.exists(src): 46: print 'Error: dir - %s is not exist.'%s (src) 47: return False 48: filelists = os.listdir(src) 49: for eachfile in filelists: 50: eachfile = src + '/' +eachfile 51: if os.path.isdir(eachfile): 52: deal_dir(eachfile) 53: elif os.path.isfile(eachfile): 54: deal_file(eachfile) 55: return True 56: 57: #-------------------------------------------------------------- 58: def main(): 59: if len(sys.argv) < 2: 60: usage() 61: sys.exit(1) 62: src = sys.argv[1] 63: # get absolute dir/file path 64: if os.path.isdir(src): 65: dire = os.path.abspath(src) 66: dirFlag = True 67: elif os.path.isfile(src): 68: fl = os.path.abspath(src) 69: dirFlag = False 70: else: 71: print 'File input error' 72: 73: # deal 74: if dirFlag: 75: deal_dir(dire) 76: else: 77: deal_file(fl) 78: print 'Successful handle file.' 79: 80: #-------------------------------------------------------------- 81: if __name__ == '__main__': 82: main()
使用示例
待处理文件:
1: #ifndef _RS232_H_ 2: #define _RS232_H_ 3: 4: /* the maximum number of ports we are willing to open */ 5: #define MAX_PORTS 4 6: 7: /*this array hold information about each port we have opened */ 8: struct PortInfo{ 9: int busy; 10: char name[32]; 11: int handle; 12: }; 13: 14: int OpenCom(int portNo,const char deviceName[],long baudRate); 15: int CloseCom(int portNo); 16: int ComRd(int portNo,char buf[],int maxCnt,int Timeout); 17: int ComWrt(int portNo,const char * buf,int maxCnt); 18: 19: //long GetBaudRate(long baudRate); 20: //int OpenComConfig(int port, 21: // const char deviceName[], 22: // long baudRate, 23: // int parity, 24: // int dataBits, 25: // int stopBits, 26: // int iqSize, 27: // int oqSize); 28: 29: #endif 处理结果:
1: #ifndef _RS232_H_ 2: #define _RS232_H_ 3: #define MAX_PORTS 4 4: struct PortInfo{ 5: int busy; 6: char name[32]; 7: int handle; 8: }; 9: int OpenCom(int portNo,const char deviceName[],long baudRate); 10: int CloseCom(int portNo); 11: int ComRd(int portNo,char buf[],int maxCnt,int Timeout); 12: int ComWrt(int portNo,const char * buf,int maxCnt); 13: #endif 在使用Python正则表达式处理的时候,有一个问题,就是没法删除文件中的空行。如果想删除空行,可能还得一行行读进来,把长度为0的行不保存。这是目前感觉到的难点。 |
|