将asup列表保存到文件时,'ascii'编解码器无法编码字符错误

时间:2016-06-08 08:39:12

标签: python encoding utf-8

我有一个元组列表,我想将其保存到文件中。我通常使用.encode('utf-8')来解决这个错误,但是因为我确实有一个带有整数的元组,所以这似乎不起作用。

我的数据如下:

lis=[[(0, u'good', 19, u'quality', 1),
  (1, u'smells', 13, u'product', 0),
  (1, u'better', 14, u'packaging', 1),
 [(3, u'error', 6, u'vendor', 0)]]

如果我运行我的代码

with open("./Results.csv","w") as f:
    for k in range(0, len(lis)):
        for line in lis[k]:
            strs=str(k)+" "+" ".join(str(x)) for x in line)
            f.write(strs+"\n")

我收到了ascii代码错误。如果我在代码中使用str(x.encode('utf-8')),则会产生不同的错误,即:

AttributeError: 'int' object has no attribute 'encode'

如果你能帮助我解决这个问题,那就太好了。

最佳

亚历

4 个答案:

答案 0 :(得分:1)

你的呼叫顺序倒退了;你想要

str(x).encode('utf-8')

...虽然str()可能碰到同样的错误,如果你传递的东西可能是或不是Unicode,编码str无论如何都不一定定义明确;你应该使用

unicode(x).encode('utf-8')

答案 1 :(得分:0)

  1. 使用str(x).encode('utf-8')而非str(x.encode('utf-8'))
  2. 使用for k in lis代替for k in range(0, len(lis))
  3. 使用for line in k代替for line in lis[k]
  4. " ".join(str(x)) for x in line)中的语法错误很可能应该是 - > " ".join(str(x) for x in line)
  5. 祝你好运!

答案 2 :(得分:0)

假设您使用Python2,您可以执行以下操作:

  • 将任何内容转换为unicode字符串
  • 对获得的unicode字符串进行编码

    ...
    strs=str(k)+" "+" ".join(unicode(x).encode('utf-8') for x in line)
    ...
    

答案 3 :(得分:0)

您收到&错误,因为您正在对其中包含非ASCII字符的Unicode字符串调用'ascii' codec can't encode character

在Python 2.x中,str()将尝试使用ASCII编解码器将Unicode编码为字节。因此,永远不要在Unicodes上使用str()。相反,您可以使用str()和编解码器进行尝试。您接下来会遇到进一步的问题,因为.encode()并不总是字符串 - 有时候它是x不支持编码/解码。您已经拥有Unicode字符串,您也应该将int转换为Unicode字符串。现有的Unicode字符串,将很高兴。

实际上,如果您发现自己在代码中间使用了int.encode(),那么您就知道自己做错了什么。改为使用 Unicode三明治 - 在代码的边缘进行解码和编码。对于您,请使用.decode()模块open()对您进行io编码,自动编码。

您可以使用其他一些Python功能来使代码可读,例如openstr.format格式。总而言之,它使代码更具可读性和灵活性:

+=

看,不要摆弄import io lis=[ [ (0, u'good', 19, u'quality', 1), (1, u'smells', 13, u'product', 0), (1, u'better€', 14, u'packaging', 1) ], [ (3, u'error', 6, u'vendor', 0)] ] with io.open("results.csv","w", encoding='utf-8') as f: counter = 0 for k in lis: for line in k: concat = u" ".join(unicode(x) for x in line) outline = u"{counter} {concat}\n".format(counter=counter, concat=concat) f.write(outline) counter += 1

输出:

.encode()
相关问题