• Python读取UTF-8编码文件并使用命令行执行时输出结果的问题


    最近参加了由CCF举办的数据挖掘比赛,主办方提供了csv格式的数据文件,由于中文显示乱码的问题,我先用txt文本编辑器将编码改为utf-8格式,但是在读取文件并输出读取结果时发生了问题,代码如下:

     1 # -*- coding:utf-8 -*-
     2 __author__ = 'Jz'
     3 
     4 csvPath = 'D:/coding_file/python_file/Big Data/trainUTF8.csv'
     5 try:
     6     csv = open(csvPath, 'r')
     7     lines = csv.readlines()
     8     for line in lines:
     9         print line.decode('utf-8').encode('GBK')
    10 except IOError, ioe:
    11     if hasattr(e, 'reason'):
    12         print '文件打开失败,失败原因:' + e.reason

    运行结果如下:

    显然根据结果来看问题具体出现在print line.decode('utf-8').encode('GBK')这里,按理说应该是没有问题的,那么问题到底出现在哪里?

    后来搜索了很多相关资料,解决了问题,总结如下:Windows系统的txt文件在使用utf-8编码保存时会默认在文件开头插入三个不可见字符,称为BOM头,这个BOM头在python的codecs库中已经定义为常量。Windows根据BOM头来判断txt文件是否为utf-8编码,所以在读取文件时必须将BOM头去除或者忽略,否则python在decode和encode时会出现错误。

    解决方法:

     1 # -*- coding:utf-8 -*-
     2 __author__ = 'Jz'
     3 
     4 import codecs
     5 
     6 csvPath = 'D:/coding_file/python_file/Big Data/trainUTF8.csv'
     7 try:
     8     csv = open(csvPath, 'r')
     9     lines = csv.readlines()
    10     for line in lines:
    11         print line.decode('utf-8').encode('gbk', 'ignore')
    12 except IOError, ioe:
    13     if hasattr(e, 'reason'):
    14         print '文件打开失败,失败原因:' + e.reason

    ignore参数表示忽略其中有异常的编码,仅显示有效的编码

  • 相关阅读:
    LeetCode 127. Word Ladder 单词接龙(C++/Java)
    LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)
    LeetCode 682. Baseball Game 棒球比赛(C++/Java)
    LeetCode 218. The Skyline Problem 天际线问题(C++/Java)
    小数据池,编码
    字典
    列表
    常见的数据类型
    while循环
    初始python
  • 原文地址:https://www.cnblogs.com/jzincnblogs/p/5034734.html
Copyright © 2020-2023  润新知