【问题标题】:Unicode error when writing russian symbols to csv将俄语符号写入 csv 时出现 Unicode 错误
【发布时间】:2018-04-02 21:55:46
【问题描述】:

我想将西里尔符号写入 csv 文件,但出现 unicode 编码错误。英文符号完美。我正在使用 Python 3.6.2。

UnicodeEncodeError: 'ascii' 编解码器无法在位置编码字符 1-6:序数不在范围内(128)

import csv


with open("test.csv", 'w') as csvfile:
    csvfile = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    hello = 'привет, мир!'
    csvfile.writerow([hello])

【问题讨论】:

  • 看起来您正在使用 python2 运行脚本,在 py3 中,unicode 是默认的字符串表示形式,这意味着您应该可以将数据写入 csv 文件。
  • @TarasMatsyk 我的 PyCharm 配置为 python 3.6.2 解释器

标签: python python-3.x csv unicode


【解决方案1】:

打开文件时声明文件的编码。根据csv 文档,newline='' 也是必需的。

import csv

with open('test.csv','w',encoding='utf8',newline='') as csvfile:
    csvfile = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    hello = 'привет, мир!'
    csvfile.writerow([hello])

【讨论】:

    【解决方案2】:

    您只需要在将 hello 字符串写入文件 (csv) 之前对其进行编码。否则 Python 只希望您输入 ascii 字符,如果是非 ascii 字符,您可以使用 utf-8 编码为:

    # -*- coding: utf-8 -*-
    import csv
    
    
    with open("test.csv", 'w') as csvfile:
        csvfile = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
        hello = u'привет, мир!' # Better way of declaring a unicode string literal
        csvfile.writerow([hello.encode("utf-8")])
    

    【讨论】:

    • 我的 csv 文件中有 |b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80!'|
    • @DamirShakenov 尝试使用其他一些文本查看器,例如 sublime。
    • 在 VS Code、Atom、Excel 2016 中尝试过 - 结果相同
    • 可能您的系统/编辑器设置为 UTF-8 以外的代码页。一些编辑器提供了更改显示文件的代码页的可能性。这会给你一些结果吗?
    • 你复制粘贴了相同的代码吗?我在 Python 2.7 和 sublime 编辑器上尝试了这段代码,效果很好。
    【解决方案3】:

    将此代码添加到您的文件中

       # encoding=utf8  
       --------------------------------------
       import sys  
       reload(sys)  
       sys.setdefaultencoding('utf8')  
    

    【讨论】:

    • 能否解释一下这段代码究竟是如何解决这个问题的?
    • 它没有解决任何问题,因为问题被标记为python-3.x 并且 Python 3 的默认编码已经是 UTF-8。在 Python 2 上,此技巧用于更改 ascii 的默认编码并破坏其他依赖默认编码的模块。这总是不好的建议。
    • 好的,问题标记为Python 3,但这个解决方案实际上解决了Python 2.7的问题!谢谢老兄!
    【解决方案4】:

    对于 Python 2 的人,使用它而不是普通的“打开”函数:

    import codecs
    codecs.open(out_path, encoding='utf-8', mode='w')
    

    这相当于 Python 3 中的以下内容:

    open(out_path, 'w', encoding='utf8')
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2013-12-19
      • 2023-04-04
      相关资源
      最近更新 更多