鱼C论坛

 找回密码
 立即注册
查看: 1762|回复: 8

[已解决]os模块问题,请前辈解惑!!万分感谢!!!

[复制链接]
发表于 2020-2-12 17:47:03 | 显示全部楼层 |阅读模式

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

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

x
程序能运行,但是最终统计出来的结果是错误的,我写了30个脚本左右,显示代码只有70行。
  1. import easygui as g
  2. import os


  3. def result(start):
  4.     lines=0
  5.     total=0
  6.     text=''

  7.     for i in source:
  8.         lines = source[i]
  9.         total += lines
  10.         text +='【%s】源文件%d个,源代码%d行\n' % (i,file[i],lines)

  11.     title='统计结果'
  12.     msg='目前写了%d行代码\n完成进度:%f %%\n离10万行代码还差%d行,继续努力' %(total,total/100000,100000-total)

  13.     g.textbox(msg,title,text)  #显示结果


  14. def code(name):
  15.     lines = 0
  16.     with open(name) as f:
  17.         print('正在分析文件:%s' % name)
  18.         try:
  19.             for el in f:
  20.                 lines += 1
  21.         except UnicodeDecodeError:
  22.             pass   #格式不兼容的忽略掉
  23.     return lines


  24. def search(start):
  25.     os.chdir(start) #改变工作目录(start)

  26.     for ef in os.listdir(os.curdir):  #目录中的文件名(当前目录)
  27.         ext=os.path.splitext(ef)[1]  #留下每个文件的扩展名
  28.         if ext in target:
  29.             lines=code(ef)  #调用,打开每个后缀名一样的文件,lines=文件数量???不确定

  30.             try:    #下面的都搞不懂!!!!!
  31.                 file[ext] += 1
  32.             except KeyError:
  33.                 file[ext] = 1

  34.             try:
  35.                 source[ext] += lines

  36.             except KeyError:
  37.                 source[ext] = lines

  38.         if os.path.isdir(ef):
  39.             search(ef)   #递归调用
  40.             os.chdir(os.pardir)  #返回上一级目录


  41. source={}
  42. file={}
  43. target=['.py','.java']

  44. g.msgbox('打开存放所有代码的文件夹','代码统计')
  45. path=g.diropenbox('选择代码库')

  46. search(path)
  47. result(path)
复制代码



if ext in target:
            lines=code(ef)  #调用,打开每个后缀名一样的文件,lines=文件数量???不确定

            try:    #下面的都搞不懂!!!!!
                file[ext] += 1
            except KeyError:
                file[ext] = 1

            try:
                source[ext] += lines

            except KeyError:
                source[ext] = lines

        if os.path.isdir(ef):
            search(ef)   #递归调用
            os.chdir(os.pardir)  #返回上一级目录
这一部分的代码弄不清楚原理是什么?
求前辈解惑!!!!!!!!!!!!!!万分感谢!!!!!
最佳答案
2020-2-12 17:47:42
将代码改成这样试试:

  1. import easygui as g
  2. import os


  3. def result(start):
  4.     lines=0
  5.     total=0
  6.     text=''

  7.     for i in source:
  8.         lines = source[i]
  9.         total += lines
  10.         text +='【%s】源文件%d个,源代码%d行\n' % (i,file[i],lines)

  11.     title='统计结果'
  12.     msg='目前写了%d行代码\n完成进度:%f %%\n离10万行代码还差%d行,继续努力' %(total,total/100000,100000-total)

  13.     g.textbox(msg,title,text)  #显示结果


  14. def code(name):
  15.     lines = 0
  16.     with open(name, encoding="utf-8") as f:
  17.         print('正在分析文件:%s' % name)
  18.         try:
  19.             for el in f:
  20.                 lines += 1
  21.         except UnicodeDecodeError:
  22.             pass   #格式不兼容的忽略掉
  23.     return lines


  24. def search(start):
  25.     os.chdir(start) #改变工作目录(start)

  26.     for ef in os.listdir(os.curdir):  #目录中的文件名(当前目录)
  27.         ext=os.path.splitext(ef)[1]  #留下每个文件的扩展名
  28.         if ext in target:
  29.             lines=code(ef)  #调用,打开每个后缀名一样的文件,lines=文件数量???不确定

  30.             try:    #下面的都搞不懂!!!!!
  31.                 file[ext] += 1
  32.             except KeyError:
  33.                 file[ext] = 1

  34.             try:
  35.                 source[ext] += lines

  36.             except KeyError:
  37.                 source[ext] = lines

  38.         if os.path.isdir(ef):
  39.             search(ef)   #递归调用
  40.             os.chdir(os.pardir)  #返回上一级目录


  41. source={}
  42. file={}
  43. target=['.py','.java']

  44. g.msgbox('打开存放所有代码的文件夹','代码统计')
  45. path=g.diropenbox('选择代码库')

  46. search(path)
  47. result(path)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-12 17:47:42 | 显示全部楼层    本楼为最佳答案   
将代码改成这样试试:

  1. import easygui as g
  2. import os


  3. def result(start):
  4.     lines=0
  5.     total=0
  6.     text=''

  7.     for i in source:
  8.         lines = source[i]
  9.         total += lines
  10.         text +='【%s】源文件%d个,源代码%d行\n' % (i,file[i],lines)

  11.     title='统计结果'
  12.     msg='目前写了%d行代码\n完成进度:%f %%\n离10万行代码还差%d行,继续努力' %(total,total/100000,100000-total)

  13.     g.textbox(msg,title,text)  #显示结果


  14. def code(name):
  15.     lines = 0
  16.     with open(name, encoding="utf-8") as f:
  17.         print('正在分析文件:%s' % name)
  18.         try:
  19.             for el in f:
  20.                 lines += 1
  21.         except UnicodeDecodeError:
  22.             pass   #格式不兼容的忽略掉
  23.     return lines


  24. def search(start):
  25.     os.chdir(start) #改变工作目录(start)

  26.     for ef in os.listdir(os.curdir):  #目录中的文件名(当前目录)
  27.         ext=os.path.splitext(ef)[1]  #留下每个文件的扩展名
  28.         if ext in target:
  29.             lines=code(ef)  #调用,打开每个后缀名一样的文件,lines=文件数量???不确定

  30.             try:    #下面的都搞不懂!!!!!
  31.                 file[ext] += 1
  32.             except KeyError:
  33.                 file[ext] = 1

  34.             try:
  35.                 source[ext] += lines

  36.             except KeyError:
  37.                 source[ext] = lines

  38.         if os.path.isdir(ef):
  39.             search(ef)   #递归调用
  40.             os.chdir(os.pardir)  #返回上一级目录


  41. source={}
  42. file={}
  43. target=['.py','.java']

  44. g.msgbox('打开存放所有代码的文件夹','代码统计')
  45. path=g.diropenbox('选择代码库')

  46. search(path)
  47. result(path)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 17:49:59 | 显示全部楼层
lines 是等于文件数量。

如果 file 字典中没有 ext 键,则创建一个元素,键为 ext,值为 1。
否则找到 file 字典中键 ext 对应的值,并将它加 1。

下面的代码同理。
如果 source 字典中没有 ext 键,则创建一个元素,键为 ext,值为 lines。
否则找到 source 字典中 ext 对应的值,并将它加上 lines。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 18:15:30 | 显示全部楼层
zltzlt 发表于 2020-2-12 17:49
lines 是等于文件数量。

如果 file 字典中没有 ext 键,则创建一个元素,键为 ext,值为 1。

非常感谢,发现了问题所在,可是前辈我还要搞不懂的地方,能解答一下吗?
您看下我注释的有没有问题!!!!
  1. def search(start):
  2.     os.chdir(start) #改变工作目录(start)

  3.     for ef in os.listdir(os.curdir):  # 目录中的每个文件名(当前目录)
  4.         ext=os.path.splitext(ef)[1]  # ext= 每个文件的扩展名
  5.         if ext in target:    #扩展名在设定中的情况下(设定='.py')
  6.             lines=code(ef)  #调用,打开每个后缀名一样的文件,lines=文件数量(后缀名一样的)

  7.             try:
  8.                 file[ext] += 1
  9.             except KeyError:
  10.                 file[ext] = 1   #第一次执行,file={'.py':'1'},????

  11.             try:
  12.                 source[ext] += lines

  13.             except KeyError:
  14.                 source[ext] = lines  #第一次执行,source={'.py':'文件数量'},????

  15.         if os.path.isdir(ef):  # ef是目录的话,执行下面的代码。(可是他是文件名啊?????不是调用不了???)
  16.             search(ef)   #递归调用,
  17.             os.chdir(os.pardir)  #返回上一级目录
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 18:30:15 | 显示全部楼层
112024 发表于 2020-2-12 18:15
非常感谢,发现了问题所在,可是前辈我还要搞不懂的地方,能解答一下吗?
您看下我注释的有没有问题!! ...

1. 第一次执行,file={'.py':'1'}。
2. 第一次执行,source={'.py':'文件数量'}。
3. 如果 ef 是文件夹则执行下面的代码。如果 ef 是文件名则不执行下面的代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 18:47:43 | 显示全部楼层
zltzlt 发表于 2020-2-12 18:30
1. 第一次执行,file={'.py':'1'}。
2. 第一次执行,source={'.py':'文件数量'}。
3. 如果 ef 是文件夹 ...

我刚才看了一下,lines=代码行数,而不是文件数量。您刚才应该也没看看清楚。因为打开了文件,进行浏览,所有lines=每个打开文件的代码行数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 19:00:30 | 显示全部楼层
112024 发表于 2020-2-12 18:47
我刚才看了一下,lines=代码行数,而不是文件数量。您刚才应该也没看看清楚。因为打开了文件,进行浏览, ...

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

使用道具 举报

 楼主| 发表于 2020-2-12 20:23:54 | 显示全部楼层

每个人都会有疏忽的时候
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 20:24:55 | 显示全部楼层

最终版本,
  1. import easygui as g
  2. import os


  3. def result(start):
  4.     lines=0
  5.     text=''

  6.     for i in source:
  7.         lines = source[i]  # i是key
  8.         text +='【%s】源文件%d个,源代码%d行\n' % (i,file[i],lines)

  9.     title='统计结果'
  10.     msg='目前写了%d行代码\n完成进度:%f %%\n离10万行代码还差%d行,继续努力' %(lines,lines/100000,100000-lines)

  11.     g.textbox(msg,title,text)  #显示结果


  12. def code(name):
  13.     lines = 0
  14.     with open(name,encoding='utf-8') as f:  #打开每个文件
  15.         print('正在分析文件:%s' % name)
  16.         try:
  17.             for el in f:   #浏览文件的每一行
  18.                 lines += 1
  19.         except UnicodeDecodeError:
  20.             pass   #格式不兼容的忽略掉
  21.     return lines


  22. def search(start):
  23.     os.chdir(start) #改变工作目录(start)

  24.     for ef in os.listdir(os.curdir):  # 目录中的每个文件名(当前目录),全部过一遍
  25.         ext=os.path.splitext(ef)[1]  # ext= 每个文件的扩展名
  26.         if ext in target:    #扩展名在设定中的情况下(设定='.py')
  27.             lines=code(ef)  #调用,打开每个后缀名一样的文件,lines=每个文件代码行数(有多个)
  28.             print('行数是:%s'% lines)

  29.             try:
  30.                 file[ext] += 1  #第二次开始执行这里,{'.py':2,3,4,5...}
  31.             except KeyError:
  32.                 file[ext] = 1   #第一次执行这里,file={'.py':1}

  33.             try:
  34.                 source[ext] += lines   #第二次开始执行这里,{'.py':第一个文件+第二+第三...的行数}
  35.             except KeyError:
  36.                 source[ext] = lines  #第一次执行这里,source={'.py':'lines'},lines=第一个文件的行数

  37.         if os.path.isdir(ef):  # ef是目录的话,。
  38.             search(ef)   #递归调用,再执行一遍,直到找到.py 文件
  39.             os.chdir(os.pardir)  #返回上一级目录


  40. source={}
  41. file={}
  42. target=['.py','.java']

  43. g.msgbox('打开存放所有代码的文件夹','代码统计')
  44. path=g.diropenbox('选择代码库')

  45. search(path)
  46. result(path)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 11:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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