查看: 1643|回复: 4

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in positio...

[复制链接]

11

主题

63

帖子

159

积分

注册会员

Rank: 2

积分
159
发表于 2018-9-18 16:33:52 | 显示全部楼层 |阅读模式
本帖最后由 天使与魔鬼 于 2018-9-18 17:49 编辑

在我将dataframe写入到csv文件中时
df.to_csv('out.csv')
报了下面的错误
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
有没有办法轻松解决这个问题(即我的dataframe中有unicode字符)?有没有办法使用例如'to-tab'方法(我认为不存在)写入制表符分隔文件而不是CSV?
回复

使用道具 举报

11

主题

80

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2018-9-18 16:35:34 | 显示全部楼层
要通过选项卡分隔,可以使用以下sep参数to_csv:
  1. df.to_csv(file_name, sep='\t')
复制代码


要使用特定编码(例如'utf-8'),请使用以下encoding参数:
  1. df.to_csv(file_name, sep='\t', encoding='utf-8')
复制代码

回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-18 16:36:33 | 显示全部楼层
当你存储DataFrame对象转换成csv文件使用to_csv方法,你大概不会存储有各行序号的DataFrame对象。
您可以通过将布尔值传递给参数来避免这种情况。Index=False
有点像:
  1. df.to_csv(file_name, encoding='utf-8', index=False)
复制代码

因此,如果您的DataFrame对象是这样的:
  1. Color  Number
  2. 0   red     22
  3. 1  blue     10
复制代码

csv文件将存储:
  1. Color,Number
  2. red,22
  3. blue,10
复制代码

而不是(传递默认值 的情况True)
  1. ,Color,Number
  2. 0,red,22
  3. 1,blue,10
复制代码
回复

使用道具 举报

9

主题

74

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2018-9-18 16:37:46 | 显示全部楼层
如果您遇到编码为'utf-8'的问题,并且想要逐个单元格地进行,您可以尝试以下其他方法。
Python 2
(其中“df”是您的DataFrame对象。)
  1. for column in df.columns:
  2.     for idx in df[column].index:
  3.         x = df.get_value(idx,column)
  4.         try:
  5.             x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
  6.             df.set_value(idx,column,x)
  7.         except Exception:
  8.             print 'encoding error: {0} {1}'.format(idx,column)
  9.             df.set_value(idx,column,'')
  10.             continue
复制代码

然后尝试:
  1. df.to_csv(file_name)
复制代码

________________________________________
可以通过以下方式检查列的编码:
  1. for column in df.columns:
  2.     print '{0} {1}'.format(str(type(df[column][0])),str(column))
复制代码

警告:errors ='ignore'只会省略字符,例如
  1. IN: unicode('Regenexx\xae',errors='ignore')
  2. OUT: u'Regenexx'
  3. Python 3
  4. for column in df.columns:
  5.     for idx in df[column].index:
  6.         x = df.get_value(idx,column)
  7.         try:
  8.             x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
  9.             df.set_value(idx,column,x)
  10.         except Exception:
  11.             print('encoding error: {0} {1}'.format(idx,column))
  12.             df.set_value(idx,column,'')
  13.             continue
复制代码

回复

使用道具 举报

5

主题

41

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-10-10 08:14:40 | 显示全部楼层
问题不错哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表