我在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++上查看,我看不到这些。我如何实际上删除它们呢?
2条答案
按热度按时间jyztefdp1#
鉴于你的评论,我想你最终有 * 两 * BOM。
让我们看一个小例子,我使用内置的
open
代替pd.read_csv
/pd.to_csv
,但是encoding
参数的含义是相同的。让我们创建一个保存为UTF-8格式并带有BOM的文件:
现在让我们重新读一遍。但我们使用了不同的编码:“utf-8”而不是“utf-8-sig”。在您的示例中,您根本没有指定编码参数,但默认值很可能是“utf-8”或“cp-1252”,这两个参数都保留BOM。因此,以下代码或多或少与您的代码片段等效:
BOM作为文本的一部分读取;它是第一个字符(此处表示为
"\ufeff"
)。让我们使用合适的命令行工具来查看文件中的实际内容:
在UTF-8中,BOM被编码为三个字节
EF BB BF
。显然,第二个文件有两个字节。因此,即使是BOM感知程序也会在 foo_converted 的开头发现一些无意义的字符,因为BOM只被剥离一次。8fq7wneg2#
对我来说,BOM是在第一个列名之前添加的。幸运的是,Pandas能够将它读入 Dataframe ,BOM仍然在第一个列名之前添加。我遍历所有列,从第一个列名中删除BOM(因为我处理许多不同的csv文件源,我不能确定第一个列名):
希望这能帮助到一些人。