UnicodeEncodeError 与 in2csv

UnicodeEncodeError with in2csv

提问人:Martin 提问时间:7/7/2023 更新时间:7/8/2023 访问量:61

问:

你能帮我做点什么吗?

我有非常大的 .xlsx 文件(范围从 200MB 到 1.4GB),我需要将其转换为 .csv 格式。

我想在2csv中使用csvkit函数:

(venv) C:\Users\Martin\csvkit_tutorial>in2csv first.xlsx > second.csv

但是,当我运行它时,我收到以下错误:

C:\Users\Martin\csvkit_tutorial\venv\Lib\site-packages\agate\utils.py:274: UnnamedColumnWarning: Column 0 has no name. Using "a".
UnicodeEncodeError: 'charmap' codec can't encode characters in position 137-146: character maps to <undefined>

我不在乎第一列是否被命名为“a”。主要问题是第二个错误 UnicodeEncodeError。

创建第二个 .csv 文件,但仅在发生错误之前,即数千行中只有 133 行转换为 .csv。

我在网上看过,有人建议将编码转换为例如 utf-8 标准会有所帮助,但我不知道如何在 csvkit 中做到这一点。

谢谢你的帮助。

顶级域名: 我尝试使用 csvkit 函数 in2csv 将 .xlsx 文件转换为 .csv。 它无法正常工作,引用了 UnicodeEncodeError,并且只转换了文件的一小部分。

python unicode csvkit

评论

0赞 deceze 7/7/2023
我不知道这个工具,但一个快速的谷歌显示它有一个参数,例如,您可能想尝试将其设置为 UTF-8...?--encoding
0赞 deceze 7/7/2023
如果这没有任何作用,那么您可能只是在处理 Windows 上的 Unicode 问题:stackoverflow.com/q/5419/476
1赞 Serge Ballesta 7/7/2023
嗯。。。众所周知,旧版本的 CSVKIT 会严重处理非 ASCII 字符,并且需要在工具代码中进行快速而肮脏的修复......如果没有最小的可重复示例,很难说更多。也许您可以尝试通过检查第一个未转换的行来查找有问题的字符,以便向我们显示有问题的输入。
0赞 Martin 7/7/2023
@SergeBallesta 我看了两个文件,当包含汉字时,它们都会中断,例如亚得科技工程有限公司和帝斯曼食品专业有限公司
0赞 Serge Ballesta 7/8/2023
@deceze:csvkit 仍然有一个糟糕的非 ASCII 支持。它允许声明输入编码,但不允许声明输出编码。唯一可靠的方法是设置 PYTHONIOENCODING 环境变量。

答:

0赞 Alan 7/7/2023 #1

有 2 个答案很快就会浮现在脑海中——不过,它们在文档中很容易被遗漏。

in2csv 有一个编码参数:-e ENCODING, --encoding ENCODING

它也有 - 我不确定有什么区别,但对于您可能想要的 unicode 错误--encoding-xls ENCODING_XLS-e utf8

第二种可能性更普遍(但我不推荐) - Tips & Tricks 解释道:

Python 标准输出编码错误

如果,在运行这样的命令时,您会收到如下错误:csvlook dummy.csv | less

“ASCII”编解码器无法对位置 2 中的字符“\u0105”进行编码:序号不在范围内(128)

最简单的选项是使用 PYTHONIOENCODING 环境变量设置 Python 用于标准流的编码:

env PYTHONIOENCODING=utf8 csvlook dummy.csv | less

我不建议你普遍设置它,这里提到它是为了完整。

1赞 Serge Ballesta 7/8/2023 #2

csvkit始终使用默认编码创建输出 CSVKfile 。它有输入编码(和)的选项,但它们不用于输出。--encoding--encoding-xls

我可以使用一个包含 2 个单元格的小文件重现该错误,其中包含您在评论中提供的中文字符:亚得科技工程有限公司和帝斯曼食品专业有限公司。

将 PYTHONIOENCODING 环境变量设置为 utf8 就足以解决以下问题:

  • Windows 语法:

      set PYTHONIOENCODING=utf8
      in2csv first.xlsx > second.csv
    
  • Linux(或其他类 Unix):

      PYTHONIOENCODING=utf8 in2csv first.xlsx > second.csv