写入CSV文件时出现Unicode错误,涉及俄语符号。

3

我想将西里尔字母写入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])

2
看起来你正在使用 Python2 运行脚本,在 Py3 中 Unicode 是默认的字符串表示,这意味着你应该可以安心地将数据写入 CSV 文件。 - taras
@TarasMatsyk 我的 PyCharm 已配置为 Python 3.6.2 解释器。 - Damir Shakenov
4个回答

5
在打开文件时,声明文件的编码方式。根据 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])

0
将以下代码添加到您的文件中:

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

请问您能否详细解释一下这段代码是如何解决问题的? - pppery
这并不能解决任何问题,因为问题被标记为“python-3.x”,而Python 3的默认编码已经是UTF-8了。在Python 2中,这个技巧是用来改变ascii默认编码的,但会破坏依赖于默认编码的其他模块。这总是一个错误的建议。 - Mark Tolonen
好的,这个问题被标记为Python 3,但是这个解决方案实际上解决了Python 2.7的问题!谢谢老兄! - Hazem Elraffiee

0

在将字符串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")])

1
我在我的 CSV 文件中得到了 |b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80!'| - Damir Shakenov
@DamirShakenov 尝试使用其他文本查看器,例如 Sublime。 - ZdaR
1
也许你的系统/编辑器设置的代码页不是UTF-8。一些编辑器提供了更改显示文件的代码页的可能性。这样做有没有给你一些结果? - Juergen
你复制粘贴了同样的代码吗?我在 Python 2.7 和 Sublime 编辑器上尝试了这段代码,它可以正常工作。 - ZdaR
@Juergen 我的编辑器设置为UTF-8,我该如何在Mac OS上查看默认编码? - Damir Shakenov
显示剩余4条评论

0

对于Python 2的用户,使用这个函数代替普通的“open”函数:

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

这在 Python 3 中的等价代码如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接