Python:无法写入文件 - UnicodeEncodeError

时间:2014-07-12 22:16:02

标签: python unicode encoding

此代码应该将一些文本写入文件。 当我试图将我的文本写入控制台时,一切正常。但是当我尝试将文本写入文件时,我得到了UnicodeEncodeError。我知道,这是一个常见的问题,可以通过正确的解码或编码来解决,但我尝试了它仍然得到相同的UnicodeEncodeError。我做错了什么?

我附上了一个例子。

print "(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)".decode("utf-8")%(dict.get('name'),dict.get('description'),dict.get('ico'),dict.get('city'),dict.get('ulCislo'),dict.get('psc'),dict.get('weby'),dict.get('telefony'),dict.get('mobily'),dict.get('faxy'),dict.get('emaily'),dict.get('dic'),dict.get('ic_dph'),dict.get('kategorie')[0],dict.get('kategorie')[1],dict.get('kategorie')[2])
  
    
      

(StarBuy s.r.o.,Inzertujte s foto,auto-moto,oblečenie,reality,prácu,zvieratá,starožitnosti,dovolenky,nábytok,všetkopredeti,obuv,stroj ....

    
  
with open("test.txt","wb") as f:
   f.write("(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)".decode("utf-8")%(dict.get('name'),dict.get('description'),dict.get('ico'),dict.get('city'),dict.get('ulCislo'),dict.get('psc'),dict.get('weby'),dict.get('telefony'),dict.get('mobily'),dict.get('faxy'),dict.get('emaily'),dict.get('dic'),dict.get('ic_dph'),dict.get('kategorie')[0],dict.get('kategorie')[1],dict.get('kategorie')[2]))
  
    
      

UnicodeEncodeError:'ascii'编解码器无法对位置50中的字符u'\ u010d'进行编码:序数不在范围内(128)

    
  

哪里可能是问题?

4 个答案:

答案 0 :(得分:3)

要将Unicode文本写入文件,您可以使用io.open() function

#!/usr/bin/env python
from io import open

with open('utf8.txt', 'w', encoding='utf-8') as file:
    file.write(u'\u010d')

这是Python 3的默认设置。

注意:如果要编写文本,则不应使用二进制文件模式('b')。

定义源代码编码的

# coding: utf8与它无关。

如果您在sys.setdefaultencoding()之外看到site.py或Python测试;假设代码已损坏。

答案 1 :(得分:1)

@ ned-batchelder是对的。您必须声明系统默认编码为“utf-8”。编码评论# -*- coding: utf-8 -*-不会这样做。

要声明系统默认编码,您必须导入模块sys,然后调用sys.setdefaultencoding('utf-8')。但是,系统先前导入了sys,并删除了其setdefaultencoding方法。所以你必须在调用方法之前重新加载它。

因此,您需要在开头添加以下代码:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

答案 2 :(得分:0)

您可能需要显式声明python使用UTF-8编码。

这个SO问题的答案解释了如何做到这一点:Declaring Encoding in Python

答案 3 :(得分:0)

对于Python 2:

  1. 在文件顶部声明文档编码(如果尚未完成):

    # -*- coding: utf-8 -*-

  2. .decode替换为.encode

    with open("test.txt","wb") as f:
        f.write("(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)".encode("utf-8")%(dict.get('name'),dict.get('description'),dict.get('ico'),dict.get('city'),dict.get('ulCislo'),dict.get('psc'),dict.get('weby'),dict.get('telefony'),dict.get('mobily'),dict.get('faxy'),dict.get('emaily'),dict.get('dic'),dict.get('ic_dph'),dict.get('kategorie')[0],dict.get('kategorie')[1],dict.get('kategorie')[2]))