utf-16-le BOM csv文件

时间:2015-05-04 22:17:18

标签: python csv unicode utf-16le

我正在从playstore(统计数据等)下载一些CSV文件,并希望使用python进行处理。

cromestant@jumphost-vpc:~/stat_dev/bime$ file -bi stats/installs/*
text/plain; charset=utf-16le
text/plain; charset=utf-16le
text/plain; charset=utf-16le
text/plain; charset=utf-16le
text/plain; charset=utf-16le
text/plain; charset=utf-16le

你可以看到他们是utf-16le。

我在python 2.7上有一些代码可以处理某些文件而不是其他文件:

import codecs
.
.
fp =codecs.open(dir_n+'/'+file_n,'r',"utf-16")
 for line in fp:
  #write to mysql db

直到:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 10: ordinal not in range(128)

这样做的正确方法是什么?我已经看过“重新编码”使用cvs模块等,但csv模块本身不处理编码,因此仅仅转储到数据库似乎有点过分

2 个答案:

答案 0 :(得分:4)

您是否尝试过codecs.EncodedFile

with open('x.csv', 'rb') as f:
    g = codecs.EncodedFile(f, 'utf8', 'utf-16le', 'ignore')
    c = csv.reader(g)
    for row in c:
        print row
        # and if you want to use unicode instead of str:
        row = [unicode(cell, 'utf8') for cell in row]

答案 1 :(得分:3)

  

这样做的正确方法是什么?

正确的方法是使用Python3,其中Unicode支持更加合理。

作为一种解决方法,如果您因某些原因对Python3过敏,最好的妥协是包裹csv.reader(),如下所示:

import codecs
import csv

def to_utf8(fp):
    for line in fp:
        yield line.encode("utf-8")

def from_utf8(fp):
    for line in fp:
        yield [column.decode('utf-8') for column in line]

with codecs.open('utf16le.csv','r', 'utf-16le') as fp:
    reader = from_utf8(csv.reader(to_utf8(fp)))
    for line in reader:
        #"line" is a list of unicode strings
        #write to mysql db
        print line