鱼C论坛

 找回密码
 立即注册
查看: 1760|回复: 2

[已解决]open()打开py文件 碰到UnicodeDecodeError

[复制链接]
发表于 2017-8-11 17:07:19 | 显示全部楼层 |阅读模式

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

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

x
  1. import easygui as g
  2. import os

  3. def countPyLines(path):
  4.    
  5.     for i in path:
  6.         for each in i[2]:
  7.             file_ext = os.path.splitext(each)
  8.             if file_ext[1] in ['.py','.c','.cpp','.pas','.asm']:
  9.                 ext = file_ext[1]
  10.                 file_path = i[0] + os.sep + each #获得所有指定后缀文件路径
  11.                 file_dict[ext] += 1
  12.                 f = open(file_path,'rb')
  13.                 for eachline in f:
  14.                     codeline_dict[ext] += 1
  15.                 f.close()
  16.                                     
  17.     detail = ''
  18.     lines = 0
  19.     for keys in file_dict.keys():      
  20.         detail += '【%s】文件共%s个,共%s行\n'%(keys, file_dict[keys], codeline_dict[keys])
  21.         lines += codeline_dict[keys]
  22.     message = '您目前共累积编写了%s行代码,完成进度:%.2f%%  \n离10万行代码还差%s行,请继续努力'% (lines, lines/1000, 100000-lines)      
  23.     g.textbox(message,'统计结果',detail)

  24. file_dict = {'.py':0,'.c':0,'.cpp':0,'.pas':0,'.asm':0}     # 初始化字典 =存放指定代码文件名和文件个数
  25. codeline_dict = {'.py':0,'.c':0,'.cpp':0,'.pas':0,'.asm':0} # 初始化字典 =存放指定代码文件名和代码行数
  26. file = g.diropenbox()
  27. path = os.walk(file)
  28. countPyLines(path)
复制代码


------遍历选定文件夹下指定后缀名文件统计行数的习题。
问题就是使用open()打开py文件时碰到UnicodeDecodeError-,这种情况pass掉的话发现忽略掉了好多py的文件未统计
1.png
网上搜索使用'rb'二进制读取之后没有出现异常
但是如果读取内容要处理什么的就比较麻烦。- -为什么出现这种异常
求助求助。。
最佳答案
2017-8-11 17:58:20
本帖最后由 ba21 于 2017-8-11 18:03 编辑

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

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

使用道具 举报

发表于 2017-8-11 17:58:20 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2017-8-11 18:03 编辑

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

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

使用道具 举报

 楼主| 发表于 2017-8-11 19:40:55 | 显示全部楼层
ba21 发表于 2017-8-11 17:58
https://pypi.python.org/pypi/chardet

import chardet

谢谢回复。已用这个办法解决。
学习了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 11:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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