【问题标题】:Encoding Error when Appending to CSV Python 3.6附加到 CSV Python 3.6 时出现编码错误
【发布时间】:2017-12-23 04:45:07
【问题描述】:

所以我在 Selenium 中编写了一个网络爬虫,它附加到 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 中,例如 ón académica: ·。仅当我在打开附加模式的文件时将模式设置为“a”时才会发生这种情况。当我切换到“w”时,由于某种原因它运行良好并摆脱了字符,但它覆盖了它从 webscraper 获得的行并添加了新行。它最终会覆盖它,因为“w”会根据我从文档中的描述中获得的内容创建一个新文件或类似的东西。我查看了如何为 CSV 附加“w”,但找不到任何内容,或者它只是说切换到“a”并编码为“utf-8-sig”,但这不起作用。

我想在每次 webscraper 在代码中执行的操作时附加到 CSV,但我想摆脱编码。如果有人可以向我指出有关图书馆的方向或我在写 CSV 时忽略的东西。我看到的解决方案不适用于 latin-1。我也试过了,但这也不起作用。我想将 webscraper 的结果保存到列表或其他东西中,然后写入结果,但如果我想再次使用刮板,我只想运行脚本并将其附加到同一个文件中。该脚本已经有一种查找重复行的方法。

总而言之,有没有办法在每次提取某些内容时附加到 CSV 并摆脱编码?请让我知道如果我没有意义,我不清楚,或者我在编码的概念上弄错了。

【问题讨论】:

  • 我刚刚使用str1="Manténgase sano y saludable" 尝试了您的代码,它在 3.6.3 上对我来说可以正常工作吗?
  • 我降级到 Python 3.6.3 并再次运行我的网络爬虫,但我仍然得到类似“Excelente Pronunciación”之类的东西?
  • 你能用你尝试的示例脚本更新问题吗?我可以在这里尝试相同的。同时删除该文件并让它为您的重新测试创建一个新文件

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


【解决方案1】:

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

出于某些(历史?)原因,尽管 UTF-8 在 WWW 中很受欢迎,但 Windows 生态系统从未喜欢过它。 相反,本机软件倾向于使用 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。 你说它在 write ("w") 模式下工作,但在 append ("a") 模式下不行。

通过使用 Python 3.5.2 进行快速测试,我注意到 BOM 不是以追加模式编写的,除非该文件事先不存在。 这是明智的行为:不应该重复 BOM,您只希望在文件的最开头使用一次,因此在以附加模式打开现有文件时,您不希望它以另一个 BOM。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2013-03-27
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多