【问题标题】:Python 2.7 with pandas to_csv() gives UnicodeEncodeError: 'ascii' codec can't encode character u'\xc7' in position 4: ordinal not in range(128)带有熊猫 to_csv() 的 Python 2.7 给出 UnicodeEncodeError: 'ascii' codec can't encode character u'\xc7' in position 4: ordinal not in range(128)
【发布时间】:2019-06-17 22:36:02
【问题描述】:

我正在使用 Python 2.7,为了克服 UTF-8 问题,我正在使用 pandas to_csv 方法。问题是,我仍然收到 unicode 错误,当我在本地笔记本电脑上使用 python 3(不是批处理选项)运行脚本时,我没有收到。

df = pd.DataFrame(stats_results)

df.to_csv('/home/mp9293q/python_scripts/stats_dim_registration_set_column_transpose.csv', quoting=csv.QUOTE_ALL, doublequote=True, index=False,
          index_label=False, header=False, line_terminator='\n', encoding='utf-8');

给出错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xc7' in position 4: ordinal not in range(128)

【问题讨论】:

  • 文件是否已经存在,或者这个截图是否创建了一个新文件?
  • 已经存在了,你在想什么?

标签: python pandas csv unicode


【解决方案1】:

我相信您可能遇到以下两个问题之一(或两者都有):-

  1. 正如您在 cmets 中提到的,您尝试使用的文件 保存 Unicode 数据,已经存在。然后有相当 目标文件可能没有的可能性 UTF-8/16/32 作为它的编码方案。

    我的意思是,当文件最初创建时,它是编码的 scheme 可能不是 UTF-8,它可能是 ANSI。所以, 检查目标文件的编码方案是否为UTF 家庭与否。

  2. 将 Unicode 字符串编码为 UTF-8, 在将其存储在文件中之前。我的意思是,你的任何内容 正在尝试保存到您的目标文件,如果包含 Unicode 文本,则应先对其进行编码。

    例如

    # A character which could not be encoded via 8 bit ASCII
    Uni_str = u"Ç"
    
    # Converting the unicode text, into UTF-8 format
    Uni_str = Uni_str.encode("utf-8")
    

    以上代码在python 2.x和3.x中工作方式不同,原因 因为 2.x 使用 ASCII 作为默认编码方案,而 3.x 使用 UTF-8。两者之间的另一个区别是它们如何处理字符串 通过encode()传递它之后。

    在 Python 2.x 中

    type(u"Ç".encode("utf-8"))
    

    输出

    <type 'str'>
    

    在 Python 3.x 中

    type(u"Ç".encode("utf-8"))
    

    输出

    <class 'bytes'>
    

    如您所见,在 python 2.x 中,encode() 的返回类型为 字符串,但在 3.x 中是字节。

因此,对于您的情况,我建议您在尝试将其存储在文件中之前,使用 encode() 对数据框中包含 unicode 数据的每个字符串值进行编码。

【讨论】:

  • 您好,感谢您的详细回复。问题是我正在将 1700 万条记录集从 Oracle 读取到内存中 - 我们是说我必须在生成 CSV 之前手动编码每个值吗?无论文件是否为新文件,该错误似乎都会发生。我尝试使用 dataframe to_csv 方法,但同样的问题。我正在使用 UTF-8 选项通过 cx_Oracle python 库读取数据。
  • @smackenzie 好吧,不是所有的值,而只有那些可能包含 unicode 值(如名称、位置等)(~通常是任何字符串)。所以你可以排除非字符串值。其次,我也有一个类似的项目,我必须定期在文件中插入 unicode 数据。我所做的是,我在创建文件时将文件的编码定义为utf-8。从那以后,我不必每次将 unicode 值写入文件时对其进行编码。原因,因为python 3.x原生支持UTF-8,所以不需要对值进行编码,只需将文件定义为UTF-8即可。
  • 我目前仅限于 2.7,因为我们没有在集群上设置 3.x 兼容版本的 cx_Oracle。
  • @smackenzie 如果是这样的话,我认为那里不存在任何其他方法(至少据我所知)。因为,Python 2.x 或多或少地与 ASCII 和仅 ASCII 一起工作。所以,对我来说唯一可行的解​​决方案是通过encode() 传递每个字符串值
猜你喜欢
  • 2017-08-22
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2018-08-25
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多