我正在尝试解码我从文件中获取的字符串:
file = open ("./Downloads/lamp-post.csv", 'r')
data = file.readlines()
data[0]
'\ XFF \ xfeK \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ X00 \吨\ x00C \ x00o \ x00m \ x00p \ x00e \ x00t \ x00i \ x00t \ x00i \ x00o \ x00n \ X00 \吨\ x00G \ x00l \ x00o \ x00b \ X00A \ x00l \ X00 \ x00M \ x00o \ x00n \ x00t \ x00h \ x00l \ x00y \ X00 \ x00S \ x00e \ X00A \ x00r \ x00c \ x00h \ x00e \ x00s \ X00 \吨\ x00D \ x00e \ x00c \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00N \ x00o \ x00v \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00O \ x00c \ x00t \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00S \ x00e \ x00p \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ X00A \ x00u \ x00g \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00J \ x00u \ x00l \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00J \ x00u \ x00n \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00M \ X00A \ x00y \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ X00A \ x00p \ x00r \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00M \ X00A \ x00r \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00F \ x00e \ x00b \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ x00J \ X00A \ x00n \ X00 \ X002 \ X000 \ X001 \ X000 \ X00 \吨\ X00A \ x00d \ X00 \ x00s \ x00h \ X00A \ x00r \ x00e \ X00 \吨\ x00S \ x00e \ X00A \ x00r \ x00c \ x00h \ X00 \ x00s \ x00h \ X00A \ x00r \ x00e \ X00 \吨\ x00E \ x00s \ x00t \ x00i \ x00m \ X00A \ x00t \ x00e \ x00d \ X00 \ X00A \ x00v \ x00g \ X00 \ X00 \ x00C \ x00P \ x00C \ X00 \吨\ x00E \ x00x \ x00t \ x00r \ X00A \ x00c \ x00t \ x00e \ x00d \ X00 \ x00F \ x00r \ x00o \ x00m \ X00 \ x00W \ x00e \ x00b \ X00 \ x00P \ X00A \ x00g \ x00e \ X00 \吨\ x00L \ x00o \ x00c \ X00A \ x00l \ X00 \ x00M \ x00o \ x00n \ x00t \ x00h \ x00l \ x00y \ X00 \ x00S \ x00e \ X00A \ x00r \ x00c \ x00h \ x00e \ x00s \ X00 \ N'
添加忽略并没有真正帮助......:
在[69]中:数据[2] Out [69]:u'\ u6700 \ u6100 \ u6200 \ u6500 \ u600 \ u2000 \ u60000 \ u6100 \ u6d00 \ u7000 \ u2000 \ u7000 \ u60000 \ u7300 \ u7400 \ u0900 \ u3000 \ u2e00 \ u3900 \ u3400 \ u0900 \ u3800 \ u3800 \ U3000 \ u0900 \ u2d00 \ u0900 \ U3300 \ U3200 \ U3000 \ u0900 \ U3300 \ u3900 \ U3000 \ u0900 \ U3300 \ u3900 \ U3000 \ u0900 \ U3400 \ u3800 \ U3000 \ u0900 \ U3500 \ u3900 \ U3000 \ u0900 \ U3500 \ u3900 \ U3000 \ u0900 \ u3700 \ U3200 \ U3000 \ u0900 \ u3700 \ U3200 \ U3000 \ u0900 \ U3300 \ u3900 \ U3000 \ u0900 \ U3300 \ U3200 \ U3000 \ u0900 \ U3200 \ u3600 \ U3000 \ u0900 \ u2d00 \ u0900 \ u2d00 \ u0900 \ UA300 \ U3200 \ u2e00 \ u3100 \ u3800 \ u0900 \ u2d00 \ u0900 \ U3400 \ u3800 \ U3000 \ u0a00'
在[70]中:数据[2] .decode(“utf-8”, “更换”) -------------------------------------------------- ------------------------- 追溯(最近的呼叫最后一次)
/ Users / oleg / in ()
/opt/local/lib/python2.5/encodings/utf_8.py 在解码(输入,错误) 14 15 def解码(输入,错误='严格'): ---> 16返回codecs.utf_8_decode(输入,错误, 真正) 17 18类IncrementalEncoder(codecs.IncrementalEncoder):
: 'ascii'编解码器不能编码字符 位置0-87:序数不在 范围(128)
在[71]中:
答案 0 :(得分:15)
这看起来像UTF-16数据。所以试试
data[0].rstrip("\n").decode("utf-16")
编辑(供您更新):尝试一次解码整个文件,即
data = open(...).read()
data.decode("utf-16")
问题是UTF-16中的换行符是“\ n \ x00”,但是使用readlines()
会在“\ n”处拆分,而下一行会留下“\ x00”字符。
答案 1 :(得分:6)
此文件是UTF-16-LE编码文件,带有初始BOM。
import codecs
fp= codecs.open("a", "r", "utf-16")
lines= fp.readlines()
答案 2 :(得分:3)
修改强>
自从您发布2.7以来,这是2.7解决方案:
file = open("./Downloads/lamp-post.csv", "r")
data = [line.decode("utf-16", "replace") for line in file]
忽略不可编码的字符:
file = open("./Downloads/lamp-post.csv", "r")
data = [line.decode("utf-16", "ignore") for line in file]