首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非ascii字符从dictreader转换为ascii

将非ascii字符从dictreader转换为ascii
EN

Stack Overflow用户
提问于 2014-08-28 05:53:50
回答 2查看 2.3K关注 0票数 0

关于python和unicode/string有很多问题。然而,所有的答案对我都没有用。

首先,使用DictReader打开文件,然后将每一行放入数组中。然后将dict值发送到unicode。

第一步是获取数据

代码语言:javascript
复制
f = csv.DictReader(open(filename,"r")
data = []
for row in f:
    data.append(row)

第二步是从dict中获取一个字符串值并替换重音(从其他帖子中可以找到)

代码语言:javascript
复制
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有重音时,它就失败了。

代码语言:javascript
复制
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 11: ordinal not in range(128)

我见过这方面的帖子,但答案行不通。当我使用类型(S)时,它说它是<type 'str'>。因此,我尝试将该文件读入unicode。

代码语言:javascript
复制
f = csv.DictReader(codecs.open(filename,"r",encoding='utf-8'))

但一旦读到

代码语言:javascript
复制
data = []
for row in f:
    data.append(row)

此错误发生:

代码语言:javascript
复制
  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语句修改为:

代码语言:javascript
复制
f = csv.DictReader(codecs.open(filename,"r",encoding="cp1252"))

产生一个稍微不同的错误:

代码语言:javascript
复制
  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(),例如:

代码语言:javascript
复制
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和错误的

代码语言:javascript
复制
s = unicodedata.normalize('NFKD', s).encode('ascii','ignore')
TypeError: must be unicode, not str

基于Python: Converting from ISO-8859-1/latin1 to UTF-8修改为

代码语言:javascript
复制
s = unicode(s.decode("iso-8859-1").encode('utf8'))

产生一个不同的错误:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-28 06:39:41

我认为这应该是可行的:

代码语言:javascript
复制
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字符串。

票数 1
EN

Stack Overflow用户

发布于 2020-03-19 03:47:42

参考:UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128),@Duncan的答案,

代码语言:javascript
复制
print repr(ch)

示例:

代码语言:javascript
复制
string = 'Ka\u011f KO\u011e52 \u0131 \u0130\u00f6\u00d6 David \u00fc K\u00dc\u015f\u015e \u00e7 \u00c7'

print (repr(string))

它打印:

代码语言:javascript
复制
'Kağ KOĞ52 ı İöÖ David ü KÜşŞ ç Ç'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25541631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档