统计代码文件中的实际有效行数,去掉空行、单行注释、多行注释

#coding=gbk

import os

#rootdir=‘f:\\pylianxi‘
def count_line_core(file_name):  ##传入单个文件,统计行数,之后返回该文件的实际代码行数;区分utf-8、gbk有待优化
    print(‘core_file_name:‘,file_name)
    lines_count=0
    flag=True
    try:
        with open(file_name,‘r‘,encoding=‘gbk‘) as fp:
            print(‘gbk file_name:‘,file_name)
            for i in fp:
                i=i.strip()
                if i=="‘‘‘" or i==‘"""‘:
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                elif (i.startswith("‘‘‘") and i.endswith("‘‘‘")) or (i.startswith(‘"""‘) and i.endswith(‘"""‘)):
                    continue
                elif i.startswith("‘‘‘") or i.startswith(‘"""‘) or i.endswith("‘‘‘") or i.endswith(‘"""‘):
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                if flag==True and i!=‘‘ and not i.startswith(‘#‘):
                    lines_count+=1
                    #print(i)
                if i.startswith(‘#-*-‘) or i.startswith(‘#coding‘) or i.startswith(‘#encoding‘):
                    lines_count+=1
                    #print(i)
    except:
        with open(file_name,‘r‘,encoding=‘utf-8‘) as fp:
            print(‘utf-8 file_name:‘,file_name)
            for i in fp:
                i=i.strip()
                if i=="‘‘‘" or i==‘"""‘:
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                elif (i.startswith("‘‘‘") and i.endswith("‘‘‘")) or (i.startswith(‘"""‘) and i.endswith(‘"""‘)):
                    continue
                elif i.startswith("‘‘‘") or i.startswith(‘"""‘) or i.endswith("‘‘‘") or i.endswith(‘"""‘):
                    if flag==True:
                        flag=False
                        continue
                    else:
                        flag=True
                        continue
                if flag==True and i!=‘‘ and not i.startswith(‘#‘):
                    lines_count+=1
                    #print(i)
                if i.startswith(‘#-*-‘) or i.startswith(‘#coding‘) or i.startswith(‘#encoding‘):
                    lines_count+=1
                    #print(i)
    return lines_count    

def code_line_count(rootdir,filetype):  ##分别处理了传入的路径是单个文件,或者传入的是文件夹
    #rootdir 传的是单个文件
    count_dict={}
    if os.path.isfile(rootdir) and os.path.splitext(rootdir)[1] in filetype:
        file_name=rootdir
        lines_count=count_line_core(file_name)
        return lines_count

    elif os.path.isdir(rootdir):
        for files in os.listdir(rootdir):
            file_name=os.path.join(rootdir,files)

            if os.path.splitext(file_name)[1] in filetype:
                print(‘file_name‘,file_name)
                lines_count=count_line_core(file_name)
                count_dict[files]=lines_count

        sum_1=sum(count_dict.values())

        return sum_1,count_dict

import sys

if __name__==‘__main__‘:
    if len(sys.argv)<3:
        print(‘参数数量不对,请输入要统计代码行数的文件路径及文件类型,如.txt .py等!‘)
        sys.exit()
    if os.path.exists(sys.argv[1]):
        if os.path.isfile(sys.argv[1]):
            print(‘该文件的代码行数为:‘,code_line_count(sys.argv[1],sys.argv[2:]))

        elif os.path.isdir(sys.argv[1]):
            print(‘sys.argv[1],sys.argv[2:]‘,sys.argv[1],sys.argv[2:])
            result=code_line_count(sys.argv[1],sys.argv[2:])
            print(‘总代码行数为:%s,每个文件代码行数为:%s‘%result)
            #for i in result[1]:
            print(‘*‘*20)
            print(sorted(result[1].items(),key=lambda x:x[1]))

    else:
        print(‘输入的路径不存在,请重新输入!‘)
        sys.exit()

原文地址:https://www.cnblogs.com/xiaoxiao075/p/10186834.html

时间: 2024-10-06 17:51:03

统计代码文件中的实际有效行数,去掉空行、单行注释、多行注释的相关文章

用php代码统计数据库中符合条件的行数

$sql1 = "select count(*) from t_user where age<17"; $data1 = mysql_query($sql1); $rows1=mysql_fetch_array($data1); $rowCount1 = $rows1[0];

Java学习(4):统计一个文件中的英文,中文,数字,其他字符以及字符总数

要求:统计一个文件中的英文,中文,数字,其他字符以及字符总数(此随笔以txt文件为例) import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; /** * 将一个文件中英文,中文,数字,其

统计一个文件中出现字符&#39;a&#39;的次数

# -*- coding: utf-8 -*- #python 27 #xiaodeng #统计一个文件中出现字符'a'的次数 #http://www.cnblogs.com/hongten/p/hongten_python_count.html import os number=0 def getNumber(filePath,c): 'c---->the word numbers' #统计一个文件中出现字符'a'的次数 if os.path.exists(filePath): global

eclipse中console的输出行数控制

eclipse中console的输出行数控制 开发中,会遇到当输出大量的sql语句或者错误的时候,往往会因为console输出的限制而不能完整显示,所以我们自己就需要迫切的增加显示的行数,这样 就可以通过控制台输出的信息来查看错误的原因,从而解决问题. 第一步,当项目运行时,点击console输出框,右键选择"preferences"如下图所示 第二步,选择了之后,在弹出框中,找到"limit console output",如果是选中的话就把前面的选中取消掉. 综

mysql查看数据库中所有表的行数,并进行排序

mysql查看数据库中所有表的行数,并进行排序: 进行数据库迁移或还原后,可以通过比较行数,检查数据是否正确. mysql> use information_schema; mysql> select table_name,table_rows from tables where TABLE_SCHEMA= 'kpsumi' order by table_rows desc; 原文地址:http://blog.51cto.com/9285090/2119096

统计python文件中的代码,注释,空白对应的行数

其实代码和空白行很好统计,难点是注释行 python中的注释分为以#开头的单行注释 或者以'''开头以'''结尾 或以"""开头以"""结尾的文档注释,如: ''' hello world '''和 ''' hello world''' 思路是用is_comment记录是否存在多行注释,如果不存在,则判断当前行是否以'''开头,是则将is_comment设为True,否则进行空行.当前行注释以及代码行的判断,如果is_comment已经为True

[linux] shell脚本编程-统计日志文件中的设备号发通知邮件

1.日志文件列表 比如:/data1/logs/2019/08/15/ 10.1.1.1.log.gz 10.1.1.2.log.gz 2.统计日志中的某关键字shell脚本 zcat *.gz|grep 关键字 |grep -oP "deviceid=[^=]+"|uniq|sort -u > /tmp/20190815.log date 格式化出年月等信息,拼接成路径 wc -l /tmp/20190815.log , 获取到行数 php /xxxxx/sendmail.ph

Python 统计yaml文件中数字出现的次数

背景需求: 公司开发了一个抽奖系统,大概功能是可以设置抽奖号码,然后设置抽奖的等级及数量,再从设置的号码中抽取. 由于是抽奖系统,需要评估一下数字中奖的概率.我对这个系统进行了以下处理 1.编写初始化抽选号码,即根据初始化接口清空已有号码数据 2.根据设置号码池 3.根据抽奖接口返回数据取出中奖号码 4.将数据写入yaml文件 5.设置100次循环抽奖 6.对yaml文件进行处理,读取数据 7.按照条件取出数据 8.取出文件中出现频率最高的数字 最后结果为 附yaml文件读取代码 import

40亿个有序不同的数的文件中找一个缺失的数

编程珠玑第二题... 如果是用位图的话... 如果内存不够,那么就需要二分,注意思想就是先找到中间数mid,然后把文件以mid分为两个文件,肯定丢失的数在数目小的那个文件中,然后递归去那个小的文件中找就行了. 复杂度是o(2n)  n+n/2+n/4+n/8+..... 看了别人写了一个代码: int split(int* a, int* b, int*c, int alen, int bit) { int biter, citer, i; int v=0, re = 0, *t; while(