关于python和unicode/string有很多问题。然而,所有的答案对我都没有用。
首先,使用DictReader打开文件,然后将每一行放入数组中。然后将dict值发送到unicode。
第一步是获取数据
f = csv.DictReader(open(filename,"r")
data = []
for row in f:
data.append(row)第二步是从dict中获取一个字符串值并替换重音(从其他帖子中可以找到)
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我使用了“尝试”,但因为有些字符串有重音,其他的则没有。我不知道的是,unicode(s)与没有重音的type str一起工作,但是,当type str有重音时,它就失败了。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 11: ordinal not in range(128)我见过这方面的帖子,但答案行不通。当我使用类型(S)时,它说它是<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)发布于 2014-08-28 06:39:41
我认为这应该是可行的:
def strip_accents(s):
s = s.decode("cp1252") # decode from cp1252 encoding instead of the implicit ascii encoding used by unicode()
s = unicodedata.normalize('NFKD', s).encode('ascii','ignore')
return s使用正确的编码打开文件的原因是,DictReader似乎没有正确处理unicode字符串。
发布于 2020-03-19 03:47:42
参考:UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128),@Duncan的答案,
print repr(ch)示例:
string = 'Ka\u011f KO\u011e52 \u0131 \u0130\u00f6\u00d6 David \u00fc K\u00dc\u015f\u015e \u00e7 \u00c7'
print (repr(string))它打印:
'Kağ KOĞ52 ı İöÖ David ü KÜşŞ ç Ç'https://stackoverflow.com/questions/25541631
复制相似问题