鱼C论坛

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

[已解决]【求教】一个关于计算代码行数的问题

[复制链接]
发表于 2020-1-26 22:44:10 | 显示全部楼层 |阅读模式

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

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

x
各位大佬,小弟有一个问题想要请教:

在学Python第35课课后题中有一个问题是关于计算代码行数的。

如果是txt 文件,那么很容易,可以直接使用for each_line in f: line +=1 这样的方式就能得到这个txt文件的总行数。
然而,对于py文件,如果使用同样的方法则会报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 12: illegal multibyte sequence

然而我看了答案之后发现小甲鱼的代码中并没有用什么特殊的方法去算一个py文件的行数。
以下是小甲鱼的代码(部分)
def calc_code(file_name):    #这里的file_name是一个特殊扩展名的文件,比如.py
    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

小甲鱼的代码是可以正确运行的。

但是我尝试了几遍只是写一段找py文件行数的代码,却直接会报错。
比如:

>>> lines = 0
>>> with open('动动手1 账号中心 答案.py') as f:
        print('正在分析')
        for each_line in f:
                lines +=1

               
正在分析
Traceback (most recent call last):
  File "<pyshell#46>", line 3, in <module>
    for each_line in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 12: illegal multibyte sequence

难道是有些py文件可以读取,有些则会报错(UnicodeDecodeError)?
同样都是py文件,这是为什么呢?

非常感谢!!

最佳答案
2020-1-26 23:16:06
文件编码问题
因为大多数编辑器默认的保存编码是utf8,所以初级的解决办法是直接指定以utf8编码打开文件:
  1. lines = 0
  2. with open('动动手1 账号中心 答案.py', 'r', encoding='utf-8') as f:
  3.     print('正在分析')
  4.     for each_line in f:
  5.         lines +=1
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-26 22:53:02 | 显示全部楼层
读文本文件涉及编码问题。
这里推荐
  1. cchardet 比chardet准确度高,速度快

  2. cchardet.detect()返回字典,其中confidence是检测精确度,encoding是编码形式



  3. 1:网页编码判断:
  4. import requests
  5. import cchardet

  6. res = requests.get('http://www.baidu.com/')
  7. rawdata  = res.content
  8. cchardet.detect(rawdata)

  9. >>>{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}



  10. 2:文件编码判断

  11. import cchardet

  12. with open('c:\\111.txt','rb') as f:
  13.         msg=f.read()

  14. enc = cchardet.detect(msg)
  15. enc = enc['encoding']
  16. print(enc)



  17. # 以指定编码打开文件
  18. with open("新建文本文档.txt", "r", encoding=enc) as f:
  19.     print(f.read())


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-26 23:16:06 | 显示全部楼层    本楼为最佳答案   
文件编码问题
因为大多数编辑器默认的保存编码是utf8,所以初级的解决办法是直接指定以utf8编码打开文件:
  1. lines = 0
  2. with open('动动手1 账号中心 答案.py', 'r', encoding='utf-8') as f:
  3.     print('正在分析')
  4.     for each_line in f:
  5.         lines +=1
复制代码

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

使用道具 举报

 楼主| 发表于 2020-1-27 10:21:57 | 显示全部楼层
ba21 发表于 2020-1-26 22:53
读文本文件涉及编码问题。
这里推荐

非常感谢回复。
我大概看懂您的意思了。就是要先检测这个文件的编码。再使用正确的编码打开文件。
可是requests和cchardet这两个模块import不了,可能是要像easygui 一样先从什么地方下载安装。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-27 10:22:35 | 显示全部楼层
hrp 发表于 2020-1-26 23:16
文件编码问题
因为大多数编辑器默认的保存编码是utf8,所以初级的解决办法是直接指定以utf8编码打开文件: ...

谢谢!这种方法可行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-27 12:00:48 | 显示全部楼层
qingzk 发表于 2020-1-27 10:21
非常感谢回复。
我大概看懂您的意思了。就是要先检测这个文件的编码。再使用正确的编码打开文件。
可是 ...

你都选好最佳了,我也无需多言。~!方法你看不上没办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-6 22:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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