Python:Pandas Dataframe :删除BOM中的“√“字符

ebdffaop  于 2022-11-20  发布在  Python
关注(0)|答案(2)|浏览(201)

我在Linux机器上使用Scrapy抓取了一些网站,并保存在CSV中。当我在Windows机器上检索数据集和视图时,我看到了这些字符。下面是我如何将它们重新编码为UTF-8-SIG

import pandas as pd

my_data = pd.read_csv("./dataset/my_data.csv")
output = "./dataset/my_data_converted.csv"
my_data.to_csv(output, encoding='utf-8-sig', index=False)

所以现在如果在VSCode上查看,它们变成了?。但是如果我在Notepad++上查看,我看不到这些。我如何实际上删除它们呢?

jyztefdp

jyztefdp1#

鉴于你的评论,我想你最终有 * 两 * BOM。
让我们看一个小例子,我使用内置的open代替pd.read_csv/pd.to_csv,但是encoding参数的含义是相同的。
让我们创建一个保存为UTF-8格式并带有BOM的文件:

>>> text = 'foo'
>>> with open('/tmp/foo', 'w', encoding='utf-8-sig') as f:
...     f.write(text)

现在让我们重新读一遍。但我们使用了不同的编码:“utf-8”而不是“utf-8-sig”。在您的示例中,您根本没有指定编码参数,但默认值很可能是“utf-8”或“cp-1252”,这两个参数都保留BOM。因此,以下代码或多或少与您的代码片段等效:

>>> with open('/tmp/foo', 'r', encoding='utf8') as f:
...     text = f.read()
... 
>>> text
'\ufefffoo'
>>> with open('/tmp/foo_converted', 'w', encoding='utf-8-sig') as f:
...     f.write(text)

BOM作为文本的一部分读取;它是第一个字符(此处表示为"\ufeff")。
让我们使用合适的命令行工具来查看文件中的实际内容:

$ hexdump -C /tmp/foo
00000000  ef bb bf 66 6f 6f                                 |...foo|
00000006
$ hexdump -C /tmp/foo_converted 
00000000  ef bb bf ef bb bf 66 6f  6f                       |......foo|
00000009

在UTF-8中,BOM被编码为三个字节EF BB BF。显然,第二个文件有两个字节。因此,即使是BOM感知程序也会在 foo_converted 的开头发现一些无意义的字符,因为BOM只被剥离一次。

8fq7wneg

8fq7wneg2#

对我来说,BOM是在第一个列名之前添加的。幸运的是,Pandas能够将它读入 Dataframe ,BOM仍然在第一个列名之前添加。我遍历所有列,从第一个列名中删除BOM(因为我处理许多不同的csv文件源,我不能确定第一个列名):

for column in df.columns: #Need to remove Byte Order Marker at beginning of first column name
        new_column_name = re.sub(r"[^0-9a-zA-Z.,-/_ ]", "", column)
        df.rename(columns={column: new_column_name}, inplace=True)

希望这能帮助到一些人。

相关问题