python批量清除文件夹中的php文件代码注释及空行(转)

以下代码在win64位python3.7.6下运行良好,whitelist = ['php']指定需要在文件夹中需要批量操作的文件后缀名。本python代码修改后适用于php代码注释及空行(含tab行)的删除,如果清除其他类型的源码注释,需要修改相关代码。

另外本代码最原始的功能是用来统计文件中有效代码行数的,这里稍微做了修改,批量测了下5个php、html混合文件没有发现问题(在同一行有效代码后的 注释文件不会删除)

import os
import time
basedir = os.path.dirname(__file__)
filelists = []
# 指定想要统计的文件类型
whitelist = ['php']
#遍历文件, 递归遍历文件夹中的所有
def getFile(basedir):
    global filelists
    for parent,dirnames,filenames in os.walk(basedir):
        #for dirname in dirnames:
        #    getFile(os.path.join(parent,dirname)) #递归
        for filename in filenames:
            ext = filename.split('.')[-1]
            #只统计指定的文件类型,略过一些log和cache文件
            if ext in whitelist:
                filelists.append(os.path.join(parent,filename))
#统计一个文件的行数
def countLine(fname):
    count = 0
    single_quotes_flag = False
    double_quotes_flag = False
    fname_new = fname+'.new.txt'
    outfile = open(fname_new,'wb')

    with open(fname, 'rb') as f:
        for file_line in f:
            file_line_old=file_line
            file_line = file_line.strip()
            # print(file_line)
            # 空行
            if file_line == b'':
                pass

            # 注释 # 开头
            elif file_line.startswith(b'#'):
                pass

            # 注释 // 开头
            elif file_line.startswith(b'//'):
                pass

            # 注释/*  */在同一行开头结尾的情况
            elif file_line.startswith(b"/*") and file_line.endswith(b"*/"):
                single_quotes_flag = False


            # 注释 单引号 ''' 开头---/*
            elif file_line.startswith(b"/*") and not single_quotes_flag:
                single_quotes_flag = True
            # 注释 中间 和 ''' 结尾---- */
            elif single_quotes_flag == True:
                if file_line.endswith(b"*/"):
                    single_quotes_flag = False

            # 注释 双引号 """ 开头
            #elif file_line.startswith(b'"""') and not double_quotes_flag:
            #    double_quotes_flag = True
            # 注释 中间 和 """  结尾
            #elif double_quotes_flag == True:
            #    if (file_line.endswith(b'"""')):
            #        double_quotes_flag = False

            # 代码
            else:
                #outfile.write(file_line_old+b'\n')
                #str=file_line.strip().replace(b' ', b'').replace(b'\n', b'').replace(b'\t', b'').replace(b'\r', b'').strip()
                #if (not str2.startswith(b'//') and str2!="\n"):
                outfile.write(file_line_old)
                count += 1

        print(fname + '----', count)
        outfile.close()
        # 单个文件行数
        # print(fname,'----count:',count)
        return count

if __name__ == '__main__' :
    startTime = time.clock()
    getFile(basedir)
    totalline = 0
    for filelist in filelists:
        totalline = totalline + countLine(filelist)
    print('\033[43m total lines: \033[0m'.center(20,'-'),totalline)
    print('Done! Cost Time: %0.5f second' % (time.clock() - startTime))

因为最近有申请软著的打算,所以需要一个批量清除注释的东西,找了很久才发现上面这个代码改改还是很好用的。另外如果想要统计代码行数的话可以试试这个软件——SourceCounter,可以统计代码行数、注释行数、空格数。

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/python-delete-php-code-annotation/

赞赏

微信赞赏支付宝赞赏

发表评论