鱼C论坛

 找回密码
 立即注册
查看: 3307|回复: 9

[已解决]第35讲课后题的第4题答案是不是有问题orz

[复制链接]
发表于 2018-5-9 21:08:25 | 显示全部楼层 |阅读模式

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

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

x
如题,我照抄答案的第4题,在
text+='【%s】源文件%d个,源代码%d行\n' % (i,file_list[i],lines)
出现问题   invalid character in identifier   无效参数

是我哪里打错了吗还是什么orz

下面是我照抄的代码

=============================================================
import easygui as g
import os

def show_result(start_dir):
    lines=0
    total=0
    text=''

    for i in source_list:
        lines=source_list[i]
        total+=lines
        text+='【%s】源文件%d个,源代码%d行\n' % (i,file_list[i],lines)
    title='统计结果'
    msg='您目前共累积编写了%d行代码,完成进度:%.2f %%\n离10万行代码还差%d行,请继续努力!' % (total,total/1000,100000-total)
    g.textbox(msg,title,text)


def calc_code(file_name):
    lines=0
    with open(file_name) as f:
        print('正在分析文件:%s...' % file_name)
        try:
            for each_line in f:
                lines+=1
        except UnicodeDecodeError:
            pass                   #不可避免会遇到格式不兼容的文件,这里忽略
    return lines


def search_file(start_dir):
    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):
        ext=os.path.splitext(each_file)[1]
        if ext in target:
            lines=calc_code(each_file)   #统计行数
            try:
                fiel_list[ext]+=1
            except KeyError:
                file_list=1
            try:
                source_list[ext]+=lines
            except KeyError:
                source_list[ext]=lines

        if os.path.isdir(each_file):
            search_file(each_file)
            os.chdir(os.pardir)

            
target=['.c','.cpp','.py','.cc','.java','.pas','.asm']
file_list={}
source_list={}

g.msgbox=('请打开您存放所有代码的文件夹'.'统计代码量')
path=g.diropenbox('请选择您的代码库:')

search_file(path)
show_result(path)
最佳答案
2018-5-10 17:14:33
咕咕鸡鸽鸽 发表于 2018-5-10 15:56
orz是的,打代码打傻了,感谢纠错
但还有个问题,就是我运行的时候,有些源文件(.py) 显示是代码0行,这 ...

原因已查明,读.py文件时出现编码错误,因此代码走 except UnicodeDecodeError,导致统计出的行数为 0

我的修改建议如下(更新calc_code() ):
def calc_code(file_name):
    lines = 0
    with open(file_name, encoding = 'utf-8') as f: #打开文件时,指定编码类型为utf-8
        print('正在分析文件:%s ...' % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass
    return lines
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-9 22:08:37 From FishC Mobile | 显示全部楼层
看上去是小括号是中文的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 08:26:22 | 显示全部楼层
hi 原因如下,源代码中共3处手误

1. 第12行代码,小括号用的是中文字符。应该为 :text+='【%s】源文件%d个,源代码%d行\n' % (i,file_list[i],lines)
2. 第14行代码,同 1
3. 第55行代码,应该使用英文逗号。应该为:g.msgbox=('请打开您存放所有代码的文件夹' , '统计代码量')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 15:56:34 | 显示全部楼层
thexiosi 发表于 2018-5-10 08:26
hi 原因如下,源代码中共3处手误

1. 第12行代码,小括号用的是中文字符。应该为 :text+='【%s】源文件% ...

orz是的,打代码打傻了,感谢纠错
但还有个问题,就是我运行的时候,有些源文件(.py) 显示是代码0行,这是为什么,
就像我上面那个代码,显示的是0行,大佬求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 15:57:04 | 显示全部楼层
BngThea 发表于 2018-5-9 22:08
看上去是小括号是中文的

是的谢了,感谢纠错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 16:00:06 | 显示全部楼层
thexiosi 发表于 2018-5-10 08:26
hi 原因如下,源代码中共3处手误

1. 第12行代码,小括号用的是中文字符。应该为 :text+='【%s】源文件% ...

还有为什么
total+=lines
text+='【%s】源文件%d个,源代码%d行\n' % (i,file_list[i],lines)
这里的源代码总行数是指lines,而不是上边的total
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 16:40:26 | 显示全部楼层
本帖最后由 thexiosi 于 2018-5-10 16:42 编辑
咕咕鸡鸽鸽 发表于 2018-5-10 15:56
orz是的,打代码打傻了,感谢纠错
但还有个问题,就是我运行的时候,有些源文件(.py) 显示是代码0行,这 ...


哦,明白楼主意思了,我再看一下哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 17:14:33 | 显示全部楼层    本楼为最佳答案   
咕咕鸡鸽鸽 发表于 2018-5-10 15:56
orz是的,打代码打傻了,感谢纠错
但还有个问题,就是我运行的时候,有些源文件(.py) 显示是代码0行,这 ...

原因已查明,读.py文件时出现编码错误,因此代码走 except UnicodeDecodeError,导致统计出的行数为 0

我的修改建议如下(更新calc_code() ):
def calc_code(file_name):
    lines = 0
    with open(file_name, encoding = 'utf-8') as f: #打开文件时,指定编码类型为utf-8
        print('正在分析文件:%s ...' % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass
    return lines
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 19:06:01 | 显示全部楼层
thexiosi 发表于 2018-5-10 17:14
原因已查明,读.py文件时出现编码错误,因此代码走 except UnicodeDecodeError,导致统计出的行数为 0

...

感觉大佬,终于搞懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 19:11:05 | 显示全部楼层
咕咕鸡鸽鸽 发表于 2018-5-10 19:06
感觉大佬,终于搞懂了

不客气 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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