鱼C论坛

 找回密码
 立即注册
查看: 2245|回复: 19

[已解决]零基础学习035easygui中统计代码的问题

[复制链接]
发表于 2017-3-1 15:17:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 豌图酱 于 2017-3-1 15:21 编辑

  1. def countline(file,sym):            #统计每种编程文件的数量和行数
  2.    
  3.     count=0
  4.     line_count=0

  5.     for eachfile in file:
  6.         for each in eachfile[2]:
  7.             if os.path.splitext(each)[1] == sym:
  8.                 count+=1
  9.                 name=os.path.join(eachfile[0],each)
  10.                 with open(name) as symfile:
  11.                     try:
  12.                         for eachline in symfile:
  13.                             line_count+=1
  14.                     except UnicodeDecodeError:
  15.                         pass
  16.     return (count,line_count)
  17. import easygui as f
  18. import os
  19. dir = f.diropenbox(msg='请选择您的代码库')
  20. files = os.walk(dir)

  21. symbal=['.py','.c','.cpp','.pas','asm']
  22. txt=''

  23. linesum=0
  24. for each in symbal:
  25.     txt +=( '【%s】源文件%d个,源代码%d行\n'%(each,countline(files,each)[0],countline(files,each)[1]))
  26.     linesum+=countline(files,each)[1]
  27. rate =linesum/100000
  28. remain = 100000-linesum
  29. msg = ('您目前共累计编写了%d行代码,完成进度:%d\n离十万行代码还差%d行,请继续努力!'%(linesum,rate,remain))
  30. f.textbox(msg,'统计结果',txt)
复制代码



一开始没有做异常处理的时候会显示
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 808: illegal multibyte sequence

但是做了异常处理以后一行代码都统计不到了,求问不知是代码的问题还是编码问题导致真的一个py文件都读取不到啊??
【.py】源文件61个,源代码0行
【.c】源文件0个,源代码0行
【.cpp】源文件0个,源代码0行
【.pas】源文件0个,源代码0行
【asm】源文件0个,源代码0行
最佳答案
2017-3-1 21:11:58
这个代码是正确

  1. def countline(file,sym):            #统计每种编程文件的数量和行数
  2.    
  3.     count=0
  4.     line_count=0

  5.     for eachfile in file: #files = os.walk(dir),
  6.         #遍历top路径下的所有目录,然后返回一个三元组(路径,包含目录,包含文件)[0][1][2]一一对应
  7.         
  8.         for each in eachfile[2]:
  9.             #eachfiles返回的是所有文件
  10.             if os.path.splitext(each)[1] == sym:
  11.                 count += 1
  12.                 name = os.path.join(eachfile[0],each)
  13.                
  14.                 with open(name,"rb") as symfile:
  15.                     try:
  16.                         for eachline in symfile:
  17.                             line_count += 1
  18.                     except UnicodeDecodeError:
  19.                         pass
  20.     return (count,line_count)

  21. import easygui as f
  22. import os

  23. dir = f.diropenbox(msg='请选择您的代码库')
  24. files = os.walk(dir)

  25. symbal = ['.py','.c','.cpp','.pas','asm']
  26. txt=''

  27. linesum=0
  28. for each in symbal:
  29.     (c,v)= countline(files,each)
  30.     txt += ( '【%s】源文件%d个,源代码%d行\n'%(each, c, v))
  31.     linesum += v
  32. rate = linesum/100000
  33. remain = 100000-linesum
  34. msg = '您目前共累计编写了%d行代码,完成进度:%d\n离十万行代码还差%d行,请继续努力!'% (linesum,rate,remain)
  35. f.textbox(msg, '统计结果', txt)
复制代码
的,在open函数是,写下读取规则
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-3-1 16:10:59 | 显示全部楼层

回帖奖励 +2 鱼币

encoding = 'utf-8'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 16:27:23 | 显示全部楼层

回帖奖励 +2 鱼币

是py2吗,可以看一下22行file是不是有值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-1 16:38:14 From FishC Mobile | 显示全部楼层
xxpythonxx 发表于 2017-3-1 16:27
是py2吗,可以看一下22行file是不是有值。

是Python3,有值的,它能统计到所以py文件,可是统计不到行数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 17:21:08 | 显示全部楼层

回帖奖励 +2 鱼币

我也是菜鸟一枚,我觉得是你传的参数有问题,调用countline时,在return (count, line_count),在后面获取是,line_count获取不到
  1. for each in symbal:
  2.     txt +=( '【%s】源文件%d个,源代码%d行\n'%(each,countline(files,each)[0],countline(files,each)[1]))
  3.     linesum+=countline(files,each)[1]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-1 17:29:08 From FishC Mobile | 显示全部楼层
sunnychou 发表于 2017-3-1 17:21
我也是菜鸟一枚,我觉得是你传的参数有问题,调用countline时,在return (count, line_count),在后面获取是 ...

因为我写代码之前实验了一下,函数countline返回(a,b)数值的时候调用countline[1]可以调用的到b的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-1 19:51:59 | 显示全部楼层

那要怎么改呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 20:56:44 | 显示全部楼层
sunnychou 发表于 2017-3-1 17:21
我也是菜鸟一枚,我觉得是你传的参数有问题,调用countline时,在return (count, line_count),在后面获取是 ...

可以试一下这个代码,

  1. def countline(file,sym):            #统计每种编程文件的数量和行数
  2.    
  3.     count=0
  4.     line_count=0

  5.     for eachfile in file: #files = os.walk(dir),
  6.         #遍历top路径下的所有目录,然后返回一个三元组(路径,包含目录,包含文件)[0][1][2]一一对应
  7.         
  8.         for each in eachfile[2]:
  9.             #eachfiles返回的是所有文件
  10.             if os.path.splitext(each)[1] == sym:
  11.                 count += 1
  12.                 name = os.path.join(eachfile[0],each)
  13.                
  14.                 with open(name) as symfile:
  15.                     try:
  16.                         for eachline in symfile:
  17.                             line_count += 1
  18.                     except UnicodeDecodeError:
  19.                         pass
  20.     return (count,line_count)

  21. import easygui as f
  22. import os

  23. dir = f.diropenbox(msg='请选择您的代码库')
  24. files = os.walk(dir)

  25. symbal = ['.py','.c','.cpp','.pas','asm']
  26. txt=''

  27. linesum=0
  28. for each in symbal:
  29.     (c,v)= countline(files,each)
  30.     txt += ( '【%s】源文件%d个,源代码%d行\n'%(each, c, v))
  31.     linesum += v
  32. rate = linesum/100000
  33. remain = 100000-linesum
  34. msg = '您目前共累计编写了%d行代码,完成进度:%d\n离十万行代码还差%d行,请继续努力!'% (linesum,rate,remain)
  35. f.textbox(msg, '统计结果', txt)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 21:11:58 | 显示全部楼层    本楼为最佳答案   
这个代码是正确

  1. def countline(file,sym):            #统计每种编程文件的数量和行数
  2.    
  3.     count=0
  4.     line_count=0

  5.     for eachfile in file: #files = os.walk(dir),
  6.         #遍历top路径下的所有目录,然后返回一个三元组(路径,包含目录,包含文件)[0][1][2]一一对应
  7.         
  8.         for each in eachfile[2]:
  9.             #eachfiles返回的是所有文件
  10.             if os.path.splitext(each)[1] == sym:
  11.                 count += 1
  12.                 name = os.path.join(eachfile[0],each)
  13.                
  14.                 with open(name,"rb") as symfile:
  15.                     try:
  16.                         for eachline in symfile:
  17.                             line_count += 1
  18.                     except UnicodeDecodeError:
  19.                         pass
  20.     return (count,line_count)

  21. import easygui as f
  22. import os

  23. dir = f.diropenbox(msg='请选择您的代码库')
  24. files = os.walk(dir)

  25. symbal = ['.py','.c','.cpp','.pas','asm']
  26. txt=''

  27. linesum=0
  28. for each in symbal:
  29.     (c,v)= countline(files,each)
  30.     txt += ( '【%s】源文件%d个,源代码%d行\n'%(each, c, v))
  31.     linesum += v
  32. rate = linesum/100000
  33. remain = 100000-linesum
  34. msg = '您目前共累计编写了%d行代码,完成进度:%d\n离十万行代码还差%d行,请继续努力!'% (linesum,rate,remain)
  35. f.textbox(msg, '统计结果', txt)
复制代码
的,在open函数是,写下读取规则

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +3 收起 理由
豌图酱 + 4 + 4 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-1 21:25:13 | 显示全部楼层
sunnychou 发表于 2017-3-1 21:11
这个代码是正确的,在open函数是,写下读取规则

我改了open的''rb'没有用的哦,但是你这段代码我是可以正常用的,所以问题应该还是出在函数countline()的返回结果读取上吧,可是我用下面的代码是可以正常返回的啊,为啥这里就不行了T T


  1. def calculate(a,b):
  2.     c=a+b
  3.     d=a*b
  4.     return (c,d)
  5. print(calculate(1,2)[1])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-2 08:51:30 | 显示全部楼层
豌图酱 发表于 2017-3-1 21:25
我改了open的''rb'没有用的哦,但是你这段代码我是可以正常用的,所以问题应该还是出在函数countline()的 ...

你那个程序调用了两次conutline,在输出结果的时候,导致了程序出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-2 09:34:20 | 显示全部楼层
32269100 发表于 2017-3-2 09:08
with open(name,encoding = 'utf-8') as symfile

你打开它不转码怎么读到行数呢!

改了好像没用啊~根据楼上那个鱼油的提示应该是我调用函数结果的时候出问题了囧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-2 09:38:36 | 显示全部楼层
sunnychou 发表于 2017-3-2 08:51
你那个程序调用了两次conutline,在输出结果的时候,导致了程序出错

还是不明白啊T T是因为一个print里调用了两次函数么~
def calculate(a,b):
    c=a+b
    d=a*b
    return (c,d)
print('加法结果是%d,乘法结果是%d'%(calculate(1,2)[0],calculate(1,2)[1]))
temp=calculate(1,2)[0]
print(temp)

可是试了下这个这样也可以正常输出的啊~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-2 11:57:45 | 显示全部楼层
等我有时间帮你全部代码看一遍吧,看你的报错,我以为你跟我一样是遇到编码问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-2 18:57:02 | 显示全部楼层
32269100 发表于 2017-3-2 11:57
等我有时间帮你全部代码看一遍吧,看你的报错,我以为你跟我一样是遇到编码问题。

对啊,我本来也以为是编码的问题呢,那麻烦你啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2017-3-8 07:20:49 | 显示全部楼层

回帖奖励 +2 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-5 16:25:28 | 显示全部楼层
我也是,直接把文件读取模式改为rb就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-5 17:55:47 | 显示全部楼层

回帖奖励 +2 鱼币

学习界面最好不要学easygui
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-22 20:59:17 | 显示全部楼层
不知道用递归来遍历文件夹效率高还是使用walk()要好?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-2 09:57:12 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-25 17:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表