Linux 上的 Pandas 导入 UTF 8 (BOM) csv,并在列名称中将 BOM 标题作为明文

Pandas on Linux importing UTF 8 (BOM) csv with BOM header as cleartext in column names

提问人:Jan Jansen 提问时间:11/3/2023 最后编辑:Jan Jansen 更新时间:11/6/2023 访问量:51

问:

在 Linux 和 MacOS 上导入 csv 数据的区别

大家好,

在 Linux 下使用 UTF8 (BOM) 编码导入 csv 文件时,第一列名称包含明文形式的 BOM,例如 .pandas.read_csv\\xEF\\xBB\\xBFColumnName

当我在 MacOS 下做同样的事情时,一切都很美好。为什么会这样?

我使用 python-3.10.12 和 pandas-2.1.2。

python pandas utf-8 read-csv

评论

0赞 tripleee 11/3/2023
更重要的是,为什么您的文件首先有 BOM?
0赞 Giacomo Catenazzi 11/3/2023
只需实现一个“工具箱函数”(即您将在许多项目中使用的库文件,其中包含您编写的辅助函数),用于检查并从列名称中删除所有 BOM。它既简单又有用。问题不会变得更容易。注意:最好的方法是避免在 CSV 中使用 BOM。未来的Unicode将比现在更使BOM合法化,所以......删除 BOM 作为默认步骤,即使(尚未)没有 BOM。
0赞 Jan Jansen 11/3/2023
我必须包含一个 BOM,因为该文件必须导入到一些需要 BOM 才能正确导入 UTF8 的旧版 ERP-DB (ProAlpha) 中。
1赞 Panagiotis Kanavos 11/3/2023
@JanJansen 使用而不是 .应用程序使用 BOM 生成 CSV,因为在不询问用户的情况下,在打开文件并读取文件到最后之前,不可能猜测文件的编码。即使看完了整个文件,也只能猜测。在任何操作系统中,当您双击文件时,打开它的应用程序将检查 BOM 或使用当前的“默认”编码读取它,无论是称为 LC_LANG 还是“默认代码页”。encoding='utf8-sig'utf8
2赞 Ulrich Eckhardt 11/3/2023
我发现不同的行为很奇怪,你能分享一些代码供人们重现吗?

答:

0赞 Jan Jansen 11/6/2023 #1

似乎这不是 pandas 的问题,而是在 makefile 中使用时的 printf 行为的问题:

给定一个 UTF-8 (no-BOM) 中的文件目标.csv,其中包含以下内容:

colA;colB:...

以及一个包含如下目标的 Makefile:

target.csv:
    python3 somescript.py
    mv -v $@ $@~
    printf '\xEF\xBB\xBF' | cat - $@~ > $@

一个make target.csv

导致目标.csv 包含

\xEF\xBB\xBFcolA;colB;...

作为纯文本,编码在编辑器(例如 VSCode 或 VIM)中以 UTF-8 显示。

但是当直接在 bash 提示符中发出时,文件被正确编码为 UTF-8 (BOM):printf '\xEF\xBB\xBF' | cat - target.csv~ > target.csv

colA;colB:...

这在 MacOS 上是正确的。

我会把这个问题放在一个新线程中,因为它不是 or 的问题,而是 / 的问题。pandaspythonmakeprintf

评论

0赞 Ulrich Eckhardt 11/6/2023
这说明了为什么你应该首先提取一个最小的可重现示例。该行为中声称的操作系统依赖性早就得到了澄清。