【问题标题】:Pandas read_csv works with BOM  at beginning of file on 0.25.1 but not on 1.1.0Pandas read_csv 在 0.25.1 的文件开头使用 BOM  但不适用于 1.1.0
【发布时间】:2021-04-13 05:53:42
【问题描述】:

我正在阅读一个开头有一些 BOM  字符的网络导出文件。我能够使用 Pandas 0.25.0 处理它们:

df = pd.read_csv("filepath", encoding='windows-1252', usecols=["user_id", "date", "page"])

但是,升级到 pandas 1.1.0 会导致相同的代码出错,即未找到预期的列“user_id”,因为在较新的 pandas 版本中,它将该列视为 “user_id”。

对于想要使用更新版本的 pandas 的解决方法有什么想法吗?

它与建议的问题不同,因为它不仅仅是使用 utf-8-sig 编码的情况,因为它会引发错误,而且它适用于 Pandas 0.25,因此 Pandas 在版本中的工作方式发生了一些变化1.0 以后。我只是希望能够不读取 BOM 字符作为标题的一部分。我在下面的回答是关于如何绕过它,因为似乎没有人知道如何在新版本的 Pandas 中处理它。不知道为什么它在提供我的问题的答案并会帮助其他人解决同样的问题时被否决。

【问题讨论】:

  • 我在想BOM 用于UTF-8UTF-16 和类似但不在windows-1252 - 维基百科:BOM
  • windows-1252 不是 UTF8。 windows-1252 是人们通常(但错误地)调用 ASCII 的 Latin1 代码页。 BOM 仅用于 Unicode 文件
  • 与那个链接问题不同,我尝试了两个 UTF 编码选项,但它们都不会读入文件,两者都给我一个错误,即编解码器无法解码字节:无效的起始字节这就是为什么我必须使用 windows-1252,它和 latin1 在文件中读取,然后将 BOM 字符包含在第一个标题中

标签: python pandas


【解决方案1】:

我设法找到了解决方法,但不是最优雅的,很高兴听到其他人知道如何在加载文件时解决问题

df = pd.read_csv("filepath", encoding='windows-1252')
df = df.rename(columns=dict((col, col.replace('"user_id"', "user_id")) for col in df.columns))
df = df[["user_id", "date", "page"]]

【讨论】:

  • 为什么不指定正确的编码? utf-8 还是 utf-16?虽然,如果 read_csv wokred 过去,你有一个 UTF8 文件。尝试使用utf-8-sig 处理 BOM。
  • @PanagiotisKanavos 我尝试了这两个编码选项,但它们都给我一个错误,即编解码器无法解码字节:无效的起始字节,这就是我必须使用 windows-1252 的原因
猜你喜欢
  • 2020-10-10
  • 2018-07-13
  • 2017-11-27
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多