UnicodeEncodeError: 'ascii' codec can't encode character u'ufffd' in position 3: ordinal not in range(128)
我收到编码错误:
1
| UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 3: ordinal not in range(128) |
在下面的python(pyspark)代码中,row是数据帧行:
1 2 3 4 5 6 7
| def rowToLine(row):
line = str(row[0]).strip()
columnNum = 44
for k in xrange(1, columnNum):
line = line +"\t"
line = line + str(row[k]).strip() # encoding error here
return line |
我还尝试了下面的加入:
1 2 3
| def rowToLine(row):
s ="\t"
return s.join(row) |
但是行的一些值是int,所以我得到了错误:
1
| TypeError: sequence item 19: expected string or Unicode, int found |
有人知道怎么修理这个吗?谢谢!
- @keven,我调查了你提到的问题,但是我不清楚如何在不使用str的情况下将row[k]转换为string。有什么建议吗?
- 没有足够的上下文可以说。是否要输出UTF-8?ISO-859-1?你的数据是从文本开始的吗?
- 旁注:你想用str.join()。它的性能比您现在使用的代码要好。
- 另外,返回" ".join(str(cell).strip()对于第[:44]行中的单元格)可以替换整个函数。(我想。没有试过。
- @keven和user3757614:我也尝试了join(参见上面的修改过的问题),但是由于行中的某个值是整数,所以出现了错误。有什么建议吗?"UTF-8"就行了。谢谢!
- @用户3757614:" ".join(str(cell.strip()我相信str(cell)部分会导致编码错误…
- 好吧,真正的问题是,如果存在Unicode字符,您希望它返回什么?您可以返回一个Unicode字符串(如果将其用于其他用途,则可能会中断),也可以去掉Unicode字符。(如果将其用于其他用途,可能会损坏。)
- 不要在unicode上调用str,用row[k].encode("utf-8")对数据进行编码,或者只使用unicode,当您调用str时,您试图将其编码为ascii,这显然会导致任何非ascii字符出错,这些数据来自哪里?
- @padraiccunningham我做了:" ".join(x.encode("utf-8")for x in row)但是,我得到了错误:attributeError:"int"对象没有属性"encode",因为行中的某个元素是int。有没有办法解决这个问题?
- "\t".join([ x.encode("utf-8") if isinstance(x, basestring) else x for x in row])
- @PadraicCunningham需要[]吗?我的意思是,如果行中的x是isInstance(x,baseString),则[]将"x.encode"("utf-8")括起来。谢谢!
- 使用列表comp比使用生成器表达式要快,不管如何,都会生成一个列表,因此在这里使用生成器根本没有优势。
- 是否有充分的理由不使用python 3来完成这项任务?
- 我需要说服整个团队,将生产系统改为python 3,这不是一个小任务。python 3是一个好主意,但是迁移需要一些时间。
谢谢大家的建议!
我基本上接受了PadraicCunningham的想法,并做了一些修改来处理int case。下面的代码有效。
1 2 3
| def rowToLine(row):
s ="\t"
return s.join( x.encode("utf-8") if isinstance(x, basestring) else str(x).encode("utf-8") for x in row) |