【问题标题】:How to write unicode strings into a file? [duplicate]如何将unicode字符串写入文件? [复制]
【发布时间】:2011-07-25 21:37:45
【问题描述】:

我正在使用 python 2.6.5 我想将一些日文字符写入文件。 我收到此错误,我不知道如何更改编码。

Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
>>> s = u'\u5E73\u621015'
>>> with open("yop", "wb") as f:
...   f.write( s + "\n" );
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: 
  ordinal not in range(128)
>>> type( s )
<type 'unicode'>

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    您将不得不对 unicode 字符串进行“编码”。

    s = u'\u5E73\u621015'
    with open("yop", "wb") as f:
       f.write(s.encode("UTF-8"))
    

    尝试一下,对 unicode 和 python 有一个友好的了解:http://farmdev.com/talks/unicode/

    【讨论】:

    • 有没有办法在文本文件中写入真正的 unicode 字符,如丹麦语?我的意思是我不希望它在文件中看起来像这样“\u5E73”。我希望它看起来像文件中的真实角色。
    【解决方案2】:

    作为替代方案,您可以使用codecs 模块:

    import codecs
    s = u'\u5E73\u621015'
    with codecs.open("yop", "w", encoding="utf-8") as f:
        f.write(s)
    

    【讨论】:

      【解决方案3】:

      2.6 中的codecs.open() 函数与python3.x 中的内置open() 函数非常相似(这很有意义,因为Py3k 字符串总是 Unicode)。为了将来在 Py3k 下使用代码时对代码进行校对,您可以执行以下操作。

      import sys
      
      if sys.version_info[0] < 3:
          import codecs
          _open_func_bak = open # Make a back up, just in case
          open = codecs.open
      
      with open('myfile', 'w', encoding='utf-8') as f:
          f.write(u'\u5E73\u621015')
      

      现在您的代码在 2.x 和 3.3+ 中应该都能正常工作。

      【讨论】:

        【解决方案4】:

        在我的脚本开头插入这个往往会解决 unicode 问题。

        import sys
        reload(sys)
        sys.setdefaultencoding('utf8')
        

        【讨论】:

        • 我很惊讶这不是公认的答案。很简单,确实解决了 unicode 问题
        • @HomunculusReticulli:(1)一般来说这是一个糟糕的建议(2)它没有回答问题:“如何将 unicode 字符串写入文件?”
        • 这只是 Python 2 吗?是否有 Python 3.x 等价物?
        猜你喜欢
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 2021-09-16
        • 2016-11-09
        • 1970-01-01
        • 2011-08-10
        相关资源
        最近更新 更多