鱼C论坛

 找回密码
 立即注册
查看: 2287|回复: 3

第35讲图形界面输入最后一题运行问题,求解

[复制链接]
发表于 2017-8-21 16:48:45 | 显示全部楼层 |阅读模式

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

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

x
我的问题是在零基础入门学习python35讲课后作业的最后一题,小甲鱼的最后效果如下图
231223bhahyimbk184z8wh.png
可是我复制小甲鱼的代码运行之后的结果是这样的
QQ图片20170821164635.png
我的'.py'文件的代码不止一行,可以显示出来27个文件却只有27行,代码也是复制小甲鱼的,新手有点笨看不出来,求大神帮我看一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-21 16:58:23 | 显示全部楼层
主要文件的编码,还有一个是文件夹的访问权限

https://pypi.python.org/pypi/chardet

import chardet
#以rb读取文件返回文件的编码(用到了chardet类)
        with open(file_name, 'rb') as f:
            raw = f.read()
            result = chardet.detect(raw)  
            encoding = result['encoding']

        lines = 0   
        with open(file_name,encoding=encoding) as f:
            print('正在分析文件:%s ...' % file_name)     
            try:
                for each_line in f:
                    lines += 1
            except Exception as reason:
                print(str(reason)) # 读取出错显示错误信息......
        print('%s -> %s' % (file_name,lines))
        return lines

代码你对比下:

  1. import easygui as g
  2. import os
  3. import chardet

  4. # 显示结果函数:
  5. # source_list字典中keys为扩展名,values为行数;
  6. # file_list字典中keys为扩展名,values为相应类型的文件数;
  7. def show_result(start_dir):
  8.     lines = 0
  9.     total = 0
  10.     text = ""

  11.     for i in source_list:
  12.         lines = source_list[i]  # 读取不同类型代码的行数
  13.         total += lines          # 累加到total中
  14.         text += "【%s】源文件 %d 个,源代码 %d 行\n" % (i, file_list[i], lines)
  15.         # 以上(i, file_list[i], lines)是(扩展名,文件数,该类型文件代码量)
  16.         # 如(py,10,5700)即10个py文件,总共5700行代码
  17.         
  18.     title = '统计结果'
  19.     msg = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total/1000, 100000-total)
  20.    
  21.     g.textbox(msg, title, text)

  22. # 统计行数函数:统计文件中的行数,file_name为文件名
  23. def calc_code(file_name):
  24.         #以rb读取文件返回文件的编码(用到了chardet类)
  25.         with open(file_name, 'rb') as f:
  26.             raw = f.read()
  27.             result = chardet.detect(raw)  
  28.             encoding = result['encoding']

  29.         lines = 0   
  30.         with open(file_name,encoding=encoding) as f:
  31.             print('正在分析文件:%s ...' % file_name)     
  32.             try:
  33.                 for each_line in f:
  34.                     lines += 1
  35.             except Exception as reason:
  36.                 print(str(reason)) # 读取出错显示错误信息......
  37.         print('%s -> %s' % (file_name,lines))
  38.         return lines


  39. # 根据指定路径搜索文件函数

  40. def search_file(start_dir) :
  41.     os.chdir(start_dir)   # 把指定路径改成工作路径,有了这行代码,后面文件操作会很简单
  42.         
  43.     for each_file in os.listdir(os.curdir) :
  44.         ext = os.path.splitext(each_file)[1]
  45.         if ext in target :
  46.             lines = calc_code(each_file) # 调用统计行数函数
  47.             # 还记得异常的用法吗?如果字典中不存,抛出 KeyError,则添加字典键
  48.             # 统计文件数
  49.             try:
  50.                 file_list[ext] += 1
  51.             except KeyError:
  52.                 file_list[ext] = 1
  53.             # 统计源代码行数
  54.             try:
  55.                 source_list[ext] += lines
  56.             except KeyError:
  57.                 source_list[ext] = lines
  58.             

  59.         # 如果路径还有文件夹,进入该文件夹继续搜索
  60.         if os.path.isdir(each_file):
  61.             try:
  62.                 search_file(each_file) # 递归调用
  63.                 os.chdir(os.pardir) # 递归调用后切记返回上一层目录(**这点很关键**)
  64.             except Exception as reasion: # 跳过拒绝访问文件夹
  65.                 print(reasion)
  66.             
  67. target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
  68. file_list = {}     #字典file_list中 keys为扩展名,values为相应的文件数量
  69. source_list = {}   #字典source_listkeys为扩展名,values为代码行数

  70. g.msgbox("请打开您存放所有代码的文件夹......", "统计代码量")
  71. path = g.diropenbox("请选择您的代码库:",title='打开文件夹',default="C:\Program Files\Python36")

  72. search_file(path)   # 搜索文件
  73. show_result(path)   # 显示结果
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-21 19:13:37 | 显示全部楼层
ba21 发表于 2017-8-21 16:58
主要文件的编码,还有一个是文件夹的访问权限

https://pypi.python.org/pypi/chardet

你好,我还没用过chardet模块,网上看了下是用来解码的,可是这个小程序打开的是文本文档不需要解码吧,不是应该打开之后循环计算行数+1就可以了吗?暂时还没有考虑这么深,代码的意思我是看的懂的,就是不知道为什么我的结果做出来和小甲鱼的结果不一样,不知道哪里错了。虽然没有解决但还是谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-21 19:19:34 | 显示全部楼层
有牵挂才会怕 发表于 2017-8-21 19:13
你好,我还没用过chardet模块,网上看了下是用来解码的,可是这个小程序打开的是文本文档不需要解码吧, ...

如果不需要,还给你讲这么多,哈哈
我也没学,小甲鱼视频里也没提到,你如果想等小甲鱼出chardet模块的视频,哪得你发私信给他了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-23 09:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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