鱼C论坛

 找回密码
 立即注册
查看: 1102|回复: 5

[已解决]冰天雪地果体跪求DEBUG

[复制链接]
发表于 2020-7-28 22:55:16 | 显示全部楼层 |阅读模式

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

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

x
  1. import easygui as g
  2. import os

  3. codingdict = {}
  4. typedict = {}
  5. linecountdict = {}


  6. def ChoiceCountType():
  7.     '''选择要统计哪些代码文件类型'''
  8.     global codingdict
  9.     global typedict
  10.     global linecountdict

  11.     choices = [".py", ".c", ".cpp", ".txt", ".cs", ".aspx"]  # 设置代码文件选项
  12.     usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
  13.     codingdict = dict.fromkeys(usertype, [0, 0])  # 给类型字典赋初值  {类型,[个数,有效代码数]}
  14.     # typedict=dict.fromkeys(usertype,0)
  15.     # linecountdict=dict.fromkeys(usertype,0)
  16.     dirpath = g.diropenbox()
  17.     # print(codingdict)
  18.     return dirpath


  19. def calc_code(paths, file_name):
  20.     '''统计有效代码行的函数'''
  21.     codinglines = 0
  22.     with open(paths + "\" + file_name, errors="ignore") as fp:
  23.         print('正在分析文件:%s ...' % file_name)
  24.         dateline = fp.readlines()
  25.         for line in dateline:
  26.             if line == "\n":
  27.                 continue
  28.             elif line.startswith("#"):
  29.                 continue
  30.             else:
  31.                 codinglines += 1
  32.     return codinglines


  33. def ChoiceDir(dirpath):
  34.     '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
  35.     # global typedict
  36.     # global linecountdict
  37.     global codingdict

  38.     for paths, dirs, files in os.walk(dirpath):
  39.         if len(files) > 0:  # 如果有文件,就执行下一步的遍历文件列表
  40.             for file in files:
  41.                 ext = os.path.splitext(file)[1]  # 切片出类型,然后判断出类型在不在编程类型文件里
  42.                 if ext in codingdict.keys():  # 如果切出来的类型在字典的KEY中
  43.                     lines = calc_code(paths, file)  # 统计当前文件有效行数
  44.                     codingdict[ext][1] += lines     #字典[当前文件类型][该类型有效行数]自增lines
  45.                     codingdict[ext][0] += 1         #字典[当前文件类型][该类型文件个数]自增1


  46. def ShowResult():
  47.     msg = ""
  48.     text = ""
  49.     title = "统计结果"
  50.     totallines = 0
  51.     chaju = 0

  52.     for each in codingdict.keys():
  53.         text+=(f"[{each}]类型的文件有{codingdict[each][0]}个,共计有效代码量{codingdict[each][1]}行\n")
  54.         totallines+=codingdict[each][1]

  55.     jindu = "%.2f %%" % (totallines / 1000)
  56.     if (100000 - totallines) <= 0:
  57.         msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n你已经完成了10万行代码的代码量,牛逼的哟!"
  58.     else:
  59.         chaju = 100000 - totallines
  60.         msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n离 10 万行代码还差{chaju}行,请继续努力!"
  61.     g.textbox(msg, title, text)


  62. # 主程序
  63. openpath = ChoiceCountType()
  64. ChoiceDir(openpath)
  65. ShowResult()

复制代码


断点测试了下,问题应该是出在了
  1.     for paths, dirs, files in os.walk(dirpath):
  2.         if len(files) > 0:  # 如果有文件,就执行下一步的遍历文件列表
  3.             for file in files:
  4.                 ext = os.path.splitext(file)[1]  # 切片出类型,然后判断出类型在不在编程类型文件里
  5.                 if ext in codingdict.keys():  # 如果切出来的类型在字典的KEY中
  6.                     lines = calc_code(paths, file)  # 统计当前文件有效行数
  7.                     codingdict[ext][1] += lines     #字典[当前文件类型][该类型有效行数]自增lines
  8.                     codingdict[ext][0] += 1         #字典[当前文件类型][该类型文件个数]自增1
复制代码

这段代码里,原本想象是每遍历一个文件,如果ext在key里,那codingdict[对应文件后缀][0](文件个数)及[1](该类型有效行数)都对应的增加。
断点测试时发现是字典里所有key对应的值都增加了,并不是对应的文件类型增加。老哥们这个得咋整?
最佳答案
2020-7-28 23:22:40
本帖最后由 Twilight6 于 2020-7-28 23:25 编辑


不用 fromkeys

  1. import easygui as g
  2. import os

  3. codingdict = {}
  4. typedict = {}
  5. linecountdict = {}


  6. def ChoiceCountType():
  7.     '''选择要统计哪些代码文件类型'''
  8.     global codingdict
  9.     global typedict
  10.     global linecountdict

  11.     choices = [".py", ".c", ".cpp", ".txt", ".cs", ".aspx"]  # 设置代码文件选项
  12.     usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
  13.     codingdict = {}
  14.     for i in usertype:
  15.         codingdict[i] = [0,0]
  16.     # typedict=dict.fromkeys(usertype,0)
  17.     # linecountdict=dict.fromkeys(usertype,0)
  18.     dirpath = g.diropenbox()
  19.     # print(codingdict)
  20.     return dirpath


  21. def calc_code(paths, file_name):
  22.     '''统计有效代码行的函数'''
  23.     codinglines = 0
  24.     with open(paths + "\" + file_name, errors="ignore") as fp:
  25.         print('正在分析文件:%s ...' % file_name)
  26.         dateline = fp.readlines()
  27.         for line in dateline:
  28.             if line == "\n":
  29.                 continue
  30.             elif line.startswith("#"):
  31.                 continue
  32.             else:
  33.                 codinglines += 1
  34.     return codinglines


  35. def ChoiceDir(dirpath):
  36.     '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
  37.     # global typedict
  38.     # global linecountdict
  39.     global codingdict

  40.     for paths, dirs, files in os.walk(dirpath):
  41.         if len(files) > 0:  # 如果有文件,就执行下一步的遍历文件列表
  42.             for file in files:
  43.                 ext = os.path.splitext(file)[1]  # 切片出类型,然后判断出类型在不在编程类型文件里
  44.                 if ext in codingdict.keys():  # 如果切出来的类型在字典的KEY中
  45.                     lines = calc_code(paths, file)  # 统计当前文件有效行数
  46.                     codingdict[ext][1] += lines     #字典[当前文件类型][该类型有效行数]自增lines
  47.                     codingdict[ext][0] += 1         #字典[当前文件类型][该类型文件个数]自增1


  48. def ShowResult():
  49.     msg = ""
  50.     text = ""
  51.     title = "统计结果"
  52.     totallines = 0
  53.     chaju = 0

  54.     for each in codingdict.keys():
  55.         text+=(f"[{each}]类型的文件有{codingdict[each][0]}个,共计有效代码量{codingdict[each][1]}行\n")
  56.         totallines+=codingdict[each][1]

  57.     jindu = "%.2f %%" % (totallines / 1000)
  58.     if (100000 - totallines) <= 0:
  59.         msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n你已经完成了10万行代码的代码量,牛逼的哟!"
  60.     else:
  61.         chaju = 100000 - totallines
  62.         msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n离 10 万行代码还差{chaju}行,请继续努力!"
  63.     g.textbox(msg, title, text)


  64. # 主程序
  65. openpath = ChoiceCountType()
  66. ChoiceDir(openpath)
  67. ShowResult()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-28 23:22:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-28 23:25 编辑


不用 fromkeys

  1. import easygui as g
  2. import os

  3. codingdict = {}
  4. typedict = {}
  5. linecountdict = {}


  6. def ChoiceCountType():
  7.     '''选择要统计哪些代码文件类型'''
  8.     global codingdict
  9.     global typedict
  10.     global linecountdict

  11.     choices = [".py", ".c", ".cpp", ".txt", ".cs", ".aspx"]  # 设置代码文件选项
  12.     usertype = g.multchoicebox(msg="请从下列列表中选择要统计的代码文件类型!", title="代码统计", choices=choices)
  13.     codingdict = {}
  14.     for i in usertype:
  15.         codingdict[i] = [0,0]
  16.     # typedict=dict.fromkeys(usertype,0)
  17.     # linecountdict=dict.fromkeys(usertype,0)
  18.     dirpath = g.diropenbox()
  19.     # print(codingdict)
  20.     return dirpath


  21. def calc_code(paths, file_name):
  22.     '''统计有效代码行的函数'''
  23.     codinglines = 0
  24.     with open(paths + "\" + file_name, errors="ignore") as fp:
  25.         print('正在分析文件:%s ...' % file_name)
  26.         dateline = fp.readlines()
  27.         for line in dateline:
  28.             if line == "\n":
  29.                 continue
  30.             elif line.startswith("#"):
  31.                 continue
  32.             else:
  33.                 codinglines += 1
  34.     return codinglines


  35. def ChoiceDir(dirpath):
  36.     '''用os.walk()遍历计算文件数量和有效代码数分别存进对应列表中'''
  37.     # global typedict
  38.     # global linecountdict
  39.     global codingdict

  40.     for paths, dirs, files in os.walk(dirpath):
  41.         if len(files) > 0:  # 如果有文件,就执行下一步的遍历文件列表
  42.             for file in files:
  43.                 ext = os.path.splitext(file)[1]  # 切片出类型,然后判断出类型在不在编程类型文件里
  44.                 if ext in codingdict.keys():  # 如果切出来的类型在字典的KEY中
  45.                     lines = calc_code(paths, file)  # 统计当前文件有效行数
  46.                     codingdict[ext][1] += lines     #字典[当前文件类型][该类型有效行数]自增lines
  47.                     codingdict[ext][0] += 1         #字典[当前文件类型][该类型文件个数]自增1


  48. def ShowResult():
  49.     msg = ""
  50.     text = ""
  51.     title = "统计结果"
  52.     totallines = 0
  53.     chaju = 0

  54.     for each in codingdict.keys():
  55.         text+=(f"[{each}]类型的文件有{codingdict[each][0]}个,共计有效代码量{codingdict[each][1]}行\n")
  56.         totallines+=codingdict[each][1]

  57.     jindu = "%.2f %%" % (totallines / 1000)
  58.     if (100000 - totallines) <= 0:
  59.         msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n你已经完成了10万行代码的代码量,牛逼的哟!"
  60.     else:
  61.         chaju = 100000 - totallines
  62.         msg = f"您目前共累积编写了{totallines}行代码,完成进度:{jindu}\n离 10 万行代码还差{chaju}行,请继续努力!"
  63.     g.textbox(msg, title, text)


  64. # 主程序
  65. openpath = ChoiceCountType()
  66. ChoiceDir(openpath)
  67. ShowResult()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 23:28:53 | 显示全部楼层

成了,竟然是fromkeys的原因。我断点看了半天就是一直每弄懂为啥会全加
老哥还是你稳,感激不尽,这个真的是学到了。

点评

哈哈~加油~  发表于 2020-7-28 23:32
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 23:34:10 | 显示全部楼层

老哥,如果值会占用同一个地址,那这个方法啥情况下使用是优选?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 23:35:28 | 显示全部楼层
lamupen 发表于 2020-7-28 23:34
老哥,如果值会占用同一个地址,那这个方法啥情况下使用是优选?



容器类型的会,不可变类型就没事~比如int、 str 、float

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 09:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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