我正在从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模块本身不处理编码,因此仅仅转储到数据库似乎有点过分
答案 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