1. # encoding="utf-8"
  2. """
  3. 统计代码行数
  4. """
  5. import sys
  6. import os
  7. def count_file_line(path):
  8. """统计文件的有效行数"""
  9. countLine = 0
  10. # 设置一个标志位,当遇到以"""或者'''开头或者结尾的时候,置为False
  11. flag = True
  12. # 使用utf-8格式的编码方式读取文件,如果读取失败,将使用gbk编码方式读取文件
  13. try:
  14. fp = open(path, "r", encoding="utf-8")
  15. encoding_type = "utf-8"
  16. fp.close()
  17. except:
  18. encoding_type = "gbk"
  19. with open(path, "r", encoding=encoding_type) as fp:
  20. for line in fp:
  21. # 空行不统计
  22. if line.strip():
  23. line = line.strip()
  24. # 注意下面的这两个elif必须要前面,这样子当('"""')结束之后及时将flag置为True
  25. if line.endswith('"""') and flag == False:
  26. flag = True
  27. continue
  28. if line.endswith("'''") and flag == False:
  29. flag = True
  30. continue
  31. if flag == False:
  32. continue
  33. if line.startswith("#!") or line.startswith("#-*-") or line.startswith("# encoding"):
  34. countLine += 1
  35. # 如果以“#”号开头的,不统计
  36. elif line.startswith("#"):
  37. continue
  38. # 如果同时以("'''")或者('"""')开头或者结尾(比如:"""aaa"""),那么不统计
  39. elif line.startswith('"""') and line.endswith('"""') and line != '"""':
  40. continue
  41. elif line.startswith("'''") and line.endswith("'''") and line != "'''":
  42. continue
  43. # 如果以("'''")或者('"""')开头或者结尾(比如:aaa"""或者"""bbb),那么不统计
  44. # 注意下面的这两个elif必须要放后面
  45. elif line.startswith('"""') and flag == True:
  46. flag = False
  47. continue
  48. elif line.startswith("'''") and flag == True:
  49. flag = False
  50. continue
  51. else:
  52. countLine += 1
  53. return countLine
  54. def count_codes(path,file_types=[]):
  55. """统计所有文件代码行"""
  56. # 判断path是目录还是文件,如果是目录的话,遍历目录下所有的文件
  57. if not os.path.exists(path):
  58. print("您输入的路径不存在!")
  59. return 0
  60. countTotalLine = 0
  61. file_paths = {}
  62. if os.path.isdir(path):
  63. for root,dirs,files in os.walk(path):
  64. for name in files:
  65. if not file_types:
  66. file_types = ["txt","py"]
  67. # print(file_types)
  68. if os.path.splitext(name)[1][1:] in file_types:
  69. file_path = os.path.normpath(os.path.join(root,name))
  70. # print(file_path)
  71. file_lines = count_file_line(file_path)
  72. countTotalLine += file_lines
  73. file_paths[file_path] = file_lines
  74. else:
  75. if not file_types:
  76. file_types = ["txt","py"]
  77. if os.path.splitext(path)[1][1:] in file_types:
  78. countTotalLine = count_file_line(path)
  79. file_paths[path] = count_file_line(path)
  80. return countTotalLine,file_paths
  81. if __name__ == "__main__":
  82. # 打印出命令行输入的参数
  83. # print(sys.argv)
  84. if len(sys.argv) < 2:
  85. print("请输入路径!")
  86. sys.exit()
  87. path = sys.argv[1]
  88. # print(path)
  89. file_types = sys.argv[2:]
  90. # print(file_types)
  91. print(count_codes(path,file_types))

使用python写的一个代码统计程序的更多相关文章

  1. Python 写了一个批量生成文件夹和批量重命名的工具

    Python 写了一个批量生成文件夹和批量重命名的工具 目录 Python 写了一个批量生成文件夹和批量重命名的工具 演示 功能 1. 可以读取excel内容,使用excel单元格内容进行新建文件夹, ...

  2. 用Python写了一个postgresql函数,感觉很爽

    用Python写了一个postgresql函数,感觉很爽 CREATE LANGUAGE plpythonu; postgresql函数 CREATE OR REPLACE FUNCTION myfu ...

  3. python 怎么启动一个外部命令程序, 并且不阻塞当前进程

    http://www.myexception.cn/perl-python/1278887.html http://blog.chinaunix.net/uid-25979788-id-3081912 ...

  4. 我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容

    我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容,目前测试了300多个新闻网站的新闻页,都能准确识别

  5. 用Racket语言写了一个万花筒的程序

    用Racket语言写了一个万花筒的程序 来源:https://blog.csdn.net/chinazhangyong/article/details/79362394 https://github. ...

  6. 用python写个简单的小程序,编译成exe跑在win10上

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  7. python写的一个集合

    起因:原本打算用python写一个抢火车票的脚本.在那 期间遇见各种浏览器驱动失败的节奏....打算先缓一下 然后就去写集合了. 0x01 源码: # -*- coding:'utf-8' -*- # ...

  8. 用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  9. 分享下自己写的一个微信小程序请求远程数据加载到页面的代码

    1  思路整理 就是页面加载完毕的时候  请求远程接口,然后把数据赋值给页面的变量 ,然后列表循环 2 js相关代码  我是改的 onload函数 /** * 生命周期函数--监听页面加载 */ on ...

随机推荐

  1. C语言fread/fwrite填坑记

    坑的描述 用fwrite把数据写入文件,再用fread读取,发现后半部分的数据可能是错的. 原因:原本要写入文件的数据中,有0x0A,如果用的是文本模式打开的文件流,在windows下0x0A会被转换 ...

  2. 移动 ProgramData\Package Cache 文件夹

    装完vs2017 发现C盘快木有空间了… 瞅瞅C盘下有啥能删的好释放下空间 就找到了 Package Cache 文件夹,占用空间接近15G… 查查这个文件夹还不建议删除… (http://super ...

  3. php memcached-gui工具

    转载: https://github.com/mailopl/memcached-gui/blob/master/memcached.php 适用于在服务端查看memcache内存数据 php代码: ...

  4. cJSON源码分析

    JSON (JavaScript Object Notation) 是一种常见使用的轻量级的数据交换格式,既有利于人工读写,也方便于机器的解析和生成. 关于JSON格式的定义,参看网站[1].在该网站 ...

  5. c# 读取json文件信息

    两种方法: /// <summary> /// /// </summary> /// <returns></returns> private strin ...

  6. Imcash:坐下来认真和你们说说话

    筹备已久的Imcash终于快上线了,上线后会用作品向你们证明你们的选择是正确的.在准备的半年期间里,团队从调研.设计.市场.人员.技术方面都尽量按照最高要求来配置.从一站式服务平台到现在的资产管家,每 ...

  7. java @Override 报错解决

    有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...

  8. Android系统文件目录路径说明

    系统数据存储路径,如下:其中应用程序包名为:com.spt ContextWrapper类中,包含以下方法: 1. getFilesDir() --> 内部存储 @Override public ...

  9. [BOI2007]Mokia 摩基亚

    Description: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫 ...

  10. vue 项目界面绘制_stylus_iconfont_swiper

    stylus 兼容 less 的大部分语法 <link rel="stylesheet" href="stylus/index.css"> less ...