免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1351 | 回复: 3
打印 上一主题 下一主题

请教我的代码错字哪里? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-30 10:48 |只看该作者 |倒序浏览
请教我的代码错字哪里?
  1. # -*- coding: utf-8 -*-
  2. # 以下是统计程序代码行数的代码


  3. # 我的目的是统计所有的 *.ini,*.bas,*.frm ...... 的文件总行数,
  4. # 但是有一个问题:

  5. # Traceback (most recent call last):
  6. # File "D:\YwMis\tongji.py", line 20, in <module>
  7. #    data = f.read()
  8. #  File "C:\Python27\lib\codecs.py", line 671, in read
  9. #    return self.reader.read(size)
  10. # UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

  11. # 不知以上提示是什么意思?

  12. import os
  13. import codecs
  14. lines_count = 0
  15. for roots,dirs,files in os.walk('d:/ywmis/'):
  16.     for file in files:
  17.         if file[-4:]=='.bas' or file[-4:]=='.frm' or file[-4:]=='.sql' or file[-4:]=='.cls' or file[-4:]=='.txt':
  18.             f = codecs.open(os.path.join(roots, file),'r','gbk')
  19.             data = f.read()
  20.             f.close()
  21.             lines_count += data.count('\n')
  22.             if not data.endswith('\n'):
  23.                 lines_count += 1
  24.    
  25. print ("all lines count:%d" %lines_count)
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-07-30 12:26 |只看该作者
发现,只要存在 utf-8编码的文件,就会报错

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-07-30 13:03 |只看该作者
  1. f = open(os.path.join(roots, file), 'rb')
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-07-30 13:42 |只看该作者
本帖最后由 crifan 于 2012-07-30 13:45 编辑

由于你之前是:
f = codecs.open(os.path.join(roots, file),'r','gbk')
用gbk编码方式去打开文件,所以,当遇到UTF-8编码文件的时候,就变成:
你是在尝试用GBK编码方式去解码UTF-8编码后的字节,所以自然会出现GBK无法解码UTF-8中的某些位置的字节,出现相应的错误:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

解决办法是:
可以以3楼的rb模式打开文件,然后再解码对应文件的内容,有多种选择:
1.直接用某种编码,比如GBK,或者UTF-8,去解码,同时添加ignore参数,这样可以忽略不能解码的字符,但是只要文件中的\r \n这类字符都可以正确解码,即可接着统计行数了。
2.尝试用chardet判断对应的文件内容所用编码类型,然后再用对应编码去解码文件,这样一般不会出现解码错误,可确保解析后的内容是完整的,接着再去统计行数即可。

具体如何写代码,自己写吧。
如果不会,等偶有空再帮你写。

另:
1. 对于只用\n去统计换行,严格意义上说,只对Linux来说,这种做法是比较准确的。
对于windows上的文件,应该用 \r \n。
关于回车换行,详情可参考:
【详解】回车 换行 0x0D 0x0A CR LF r n的来龙去脉

2.我之前折腾Python过程中,也遇到过很多种UnicodeEncodeError,都一点点解决了。
感兴趣的,可以去看看相关的总结:
Python中的 UnicodeEncodeError

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP