【问题标题】:Special Charecter in Header line during text import文本导入期间标题行中的特殊字符
【发布时间】:2018-06-19 21:44:50
【问题描述】:

我正在尝试编写一个 python 脚本来导入由数据采集软件 (EC-lab) 生成的数据文件。我想将列标题保留在文件中,而不是手动定义它们,因为它们在所有文件中并不统一(不同的技术将以不同的顺序生成数据,并且标题数量不同)。问题是文件中的标题文本包含正斜杠(例如“ox/red”、“time/s”)。

当我尝试使用标题列加载数据时出现 ascii 错误

UnicodeDecodeError:“ascii”编解码器无法解码位置 19 中的字节 0xb5:序数不在范围内 (128)

我尝试根据其他解决方案添加编码作为关键字参数,但没有产生解决方案

 data = np.genfromtxt("20180611_bB_GCE-G.mpt", dtype=None, delimiter='\t', names=True, skip_header=61, encoding='utf-8')

我目前使用 genfromtxt 作为数据导入技术

data = np.genfromtxt("filename.mpt", dtype=None, delimiter='\t', names=True, skip_header=61)

【问题讨论】:

  • 该错误似乎与正斜杠无关。
  • 添加encoding='utf-8'真的不会改变错误信息,还是意味着你得到一个不同的 UnicodeDecodeError
  • 标题名称用于创建结构化数组字段名称(甚至recarray 属性)。因此它们的处理方式与字符串数据(encoding 现在处理)不同。一些参数与名称有关。关于有趣的标题名称有很多问题。

标签: python numpy genfromtxt


【解决方案1】:

首先,对于 ASCII、CSV 文件或 NumPy,标题中的正斜杠不是问题。

我的猜测是 真正的 问题是您的 CSV 是 Latin-1,或者是与 Latin-1 兼容的编码,如 Windows-1252,并且其中一个标题包含微符号µ,在这些编码中是 0xB5。或者标题实际上根本不是问题,并且某些数据中有µ 字符。

无论哪种方式,使用 ASCII 的默认编码,您都会收到关于 0xb5 不在 range(128) 中的错误,与您的问题中的完全一样。

如果您尝试通过显式指定 encoding='utf-8' 来解决此问题,那是错误的编码,您只会得到一个不同的错误,即 0xb5 是无效的起始字节。

如果您通过指定encoding='latin-1' 来修复它,它应该可以工作。

更一般地说,您必须知道您的文件实际上是什么编码,而不是胡乱猜测。特别是如果您在 Windows 上,许多文件将采用您设置为 OEM 代码页的任何编码,而其他文件将采用 UTF-16-LE,而其他文件将采用 UTF-8 但带有非法BOM等

生成它们的程序应该记录它使用的编码,或者有选项让您选择。如果不是,您需要尝试,例如,在文本编辑器中查看文件,让您选择编码以尝试找出哪个看起来正确。或者您可以使用chardet 之类的工具来帮助您猜测。

【讨论】:

  • 感谢您提供有关 chardet 的信息。它返回文件是 ISO-8859-1(与 latin-1 相同)。我对这个问题的 SO 和其他搜索已经产生了 utf-8 建议。我仍然无法获得encoding='latin-1' 来解决问题,因为我现在获得了TypeError: genfromtxt() got an unexpected keyword argument 'encoding'
  • @SophieLee 您的问题声称您使用了encoding='utf-8' 并获得了UnicodeDecodeError。如果这是真的,那么将其更改为encoding='latin-1' 将修复错误,或者给你一个不同的UnicodeDecodeError;不可能导致这个TypeError。您是否有可能在一堆不同的机器上运行,其中一些具有 NumPy 1.14.0 或更高版本,而另一些具有更早的版本?因为正如the docs 所示,encoding 是在 1.14 中添加的。
  • @SophieLee 如果您需要您的代码在旧版本上工作,有一些变通方法,但它们比仅升级 numpy 更复杂。
  • 你找到我了。我正在使用安装了 numpy 的 Anaconda 包,并假设它是最新的,但只是运行升级并从 1.13.3 升级到 1.14.5,所以这是不正确的假设。问题解决了!这是我第一次从头开始编写自己的 python,而不是使用同事的笔记本。
猜你喜欢
  • 2016-04-08
  • 2019-03-15
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
相关资源
最近更新 更多