【发布时间】:2014-10-21 21:25:26
【问题描述】:
关于 python 和 unicode/string 有很多问题。但是,没有一个答案对我有用。
首先,使用DictReader 打开一个文件,然后将每一行放入一个数组中。然后将dict值发送到转换为unicode。
第一步是获取数据
f = csv.DictReader(open(filename,"r")
data = []
for row in f:
data.append(row)
第二步是从字典中获取一个字符串值并替换重音(从其他帖子中找到)
s = data[i].get('Name')
strip_accents(s)
def strip_accents(s):
try: s = unicode(s)
except: s = s.encode('utf-8')
s = unicodedata.normalize('NFKD', s).encode('ascii','ignore')
return s
我使用 try 和 except 因为有些字符串有重音符号,而其他的则没有。我想不通的是,unicode(s) 与没有重音的 type str 一起使用,但是,当 type str 有重音时,它会失败
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 11: ordinal not in range(128)
我看过这方面的帖子,但答案不起作用。当我使用类型时,它说它是 <type 'str'> 。所以我尝试将文件读取为 unicode
f = csv.DictReader(codecs.open(filename,"r",encoding='utf-8'))
但是一旦开始阅读
data = []
for row in f:
data.append(row)
出现此错误:
File "F:...files.py", line 9, in files
for row in f:
File "C:\Python27\lib\csv.py", line 104, in next
row = self.reader.next()
File "C:\Python27\lib\codecs.py", line 684, in next
return self.reader.next()
File "C:\Python27\lib\codecs.py", line 615, in next
line = self.readline()
File "C:\Python27\lib\codecs.py", line 530, in readline
data = self.read(readsize, firstline=True)
File "C:\Python27\lib\codecs.py", line 477, in read
newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfc in position 0: invalid start byte
这个错误是由 dictreader 处理 unicode 的方式引起的吗?如何解决这个问题?
更多测试。正如@univerio 指出的那样,导致失败的一项是 ISO-8859-1
修改open语句为:
f = csv.DictReader(codecs.open(filename,"r",encoding="cp1252"))
产生一个稍微不同的错误:
File "F:...files.py", line 9, in files
for row in f:
File "C:\Python27\lib\csv.py", line 104, in next
row = self.reader.next()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 11: ordinal not in range(128)
使用基本的open语句并修改strip_accents()如:
try: s = unicode(s)
except: s = s.decode("iso-8859-1").encode('utf8')
print type(s)
s = unicodedata.normalize('NFKD', s).encode('ascii','ignore')
return str(s)
打印类型仍然是 str 和错误
s = unicodedata.normalize('NFKD', s).encode('ascii','ignore')
TypeError: must be unicode, not str
基于Python: Converting from ISO-8859-1/latin1 to UTF-8修改为
s = unicode(s.decode("iso-8859-1").encode('utf8'))
产生不同的错误:
except: s = unicode(s.decode("iso-8859-1").encode('utf8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 11: ordinal not in range(128)
【问题讨论】:
-
这意味着你有坏数据。你确定你的文件是 UTF-8 编码的吗?
0xFC不是任何有效 UTF-8 序列的第一个字节。 (见here。) -
@univerio 它在这个名字上失败了 Thomas C. Südhof ...它来自 Windows 上的一个 csv 文件,并假定它的 utf-8。但也许这是一个糟糕的假设。我如何检查所有类型,因为有不同的名称和不同的字符
-
我的意思是,当您使用
encoding='utf-8'打开文件时,python 无法解码文件的第一个字节,因为它不是 UTF-8 序列中的有效第一个字节。听起来您的文件可能是在 Windows 1252 中编码的,因为0xFC是变音符号的十六进制值。尝试使用encoding="cp1252"打开它。 -
@univerio 使用
File "C:\Python27\lib\csv.py", line 104, in next row = self.reader.next() UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 11: ordinal not in range(128)在不同的点失败 -
有没有办法询问每行的编码是什么?
标签: python string python-2.7 unicode