附加到CSV Python 3.6时的编码错误

时间:2017-12-23 04:45:08

标签: python-3.x csv selenium encoding utf-8

所以我在Selenium中编写了一个web scraper,它附加到Python 3.6中的CSV文件中。这是我现在使用的代码。

with open('webscraped.csv', 'a', encoding='utf-8-sig') as f:
            writer = csv.writer(f)
            writer.writerow([str1, str2, str3])

我的问题是,当我用西班牙语搜索这个网站时,它会将字符附加到CSV中,如ónacadémica:Â。仅当打开附加模式的文件时将模式设置为“a”时才会发生这种情况。当我切换到'w'时由于某种原因它可以正常工作并且摆脱了字符,但是它会覆盖从webscraper获得的线并添加新线。它最终覆盖它,因为'w'创建了一个新文件或类似于我从文档中的描述得到的文件。我查看了如何在'w'中添加CSV,但找不到任何或只是说切换到'a'并编码为'utf-8-sig',但这不起作用。

我希望每次webscraper在代码中执行某些操作时附加到CSV,但我想摆脱编码。如果我写信给CSV,有人可以指点我关于图书馆的方向或我忽略的事情。我见过的解决方案不适用于拉丁语-1。我也尝试过,但这也不起作用。我想将webscraper的结果保存到列表或其他内容然后编写结果,但是如果我想再次使用scraper,我想只运行脚本并让它将行追加到同一个文件中。该脚本已经有一种查找重复行的方法。

总而言之,有没有办法在每次提取内容时附加到CSV并摆脱编码?如果我没有意义,请告诉我,我不清楚,或者我在概念上遇到有关编码的错误。

1 个答案:

答案 0 :(得分:0)

您的脚本可能正在完成所有(或大部分)编码,但是用于查看输出的工具会严重显示文本。 问题的根源可能是其他问题,但是如果您在Windows上工作并使用记事本之类的工具来检查输出,则很可能发生以下情况。

对于某些(历史?)原因,Windows生态系统从未像UTF-8那样受欢迎,尽管它在WWW中很受欢迎。 相反,本机软件倾向于使用8位编码,如“Windows-1252”(源自Latin-1)或UTF-16(通常称为“Unicode”)。 使用UTF-8的这种工具的一种方法是使用byte order mark (BOM),这意味着文本前面会加一个不可见的字符。 对于所有UTF-x编码,此字符编码为不同的字节,因此通过检查前几个字节,读取器软件可以判断正在使用的编码。

如果BOM从UTF-8文件中“丢失”(理论上这很好,但在实际操作Windows时没有),一些工具将使用8位编码解释数据,如Latin- 1,因为它是无BOM文本文件的默认值。 在这种情况下,你会看到像“académica”这样的扭曲词。 参见:

>>>  'académica'.encode('utf8').decode('latin1')
'académica'

现在问题仍然存在:为什么缺少BOM? 毕竟,您已经在使用Python的“utf-8-sig”编解码器,它是带有BOM的UTF-8。 而且你说它在写(“w”)模式下有效,但在附加(“a”)模式下无效。

通过使用Python 3.5.2快速测试,我注意到BOM不是以附加模式写入的,除非文件事先不存在。 这是明智的行为:BOM不应该重复,你只需要在文件的最开头一次,所以当在追加模式下打开现有文件时,你不希望它开始新的内容另一个BOM。

我的猜测是,你 - 不熟悉所有这些特殊的细节 - 最终以某种方式创建了一个没有BOM的文件,然后继续追加它,它没有追溯性地引入BOM。 可以肯定的是,您应该重新删除/重命名“webscraped.csv”,或者告诉scraper写入另一个尚不存在的目标文件。