文本导入期间 Header 行中的特殊字符
Special Charecter in Header line during text import
我正在尝试编写一个 python 脚本来导入由数据采集软件 (EC-lab) 生成的数据文件。我想保留文件中的 header 列,而不是手动定义它们,因为它们在所有文件中都不统一(不同的技术会以不同的顺序生成数据,并且会有不同数量的 headers)。问题是文件中的 header 文本包含正斜杠(例如 "ox/red"、"time/s")。
当我尝试使用 header 列加载数据时出现 ascii 错误
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb5 in position 19: ordinal not in range(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)
首先,headers 中的正斜杠对于 ASCII、CSV 文件或 NumPy 不是问题。
我的猜测是 真正的 问题是您的 CSV 是 Latin-1,或者像 Windows-1252 这样的 Latin-1 兼容编码,并且headers 之一包含微符号 µ
,在这些编码中为 0xB5。或者 headers 实际上根本不是问题,并且您在某些数据中有 µ
个字符。
无论哪种方式,使用默认的 ASCII 编码,您都会收到关于 0xb5
不在 range(128)
中的错误,与您问题中的完全一样。
如果您尝试通过显式指定 encoding='utf-8'
来修复此问题,那是错误的编码,您只会得到一个不同的错误,关于 0xb5
是一个无效的起始字节。
如果您通过指定 encoding='latin-1'
修复它,它应该可以工作。
更一般地说,你必须知道你的文件实际上是什么编码,而不是胡乱猜测。特别是如果您在 Windows,其中许多文件将采用您设置为 OEM 代码页的任何编码,而其他文件将采用 UTF-16-LE,而其他文件将采用 UTF -8 但有非法 BOM 等
生成它们的程序应该记录它使用的编码方式,或者有可供您选择的选项。如果没有,您需要尝试,例如,在允许您 select 编码的文本编辑器中查看文件,以尝试找出哪个看起来正确。或者您可以使用 chardet
之类的工具来帮助您猜测。
我正在尝试编写一个 python 脚本来导入由数据采集软件 (EC-lab) 生成的数据文件。我想保留文件中的 header 列,而不是手动定义它们,因为它们在所有文件中都不统一(不同的技术会以不同的顺序生成数据,并且会有不同数量的 headers)。问题是文件中的 header 文本包含正斜杠(例如 "ox/red"、"time/s")。
当我尝试使用 header 列加载数据时出现 ascii 错误
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb5 in position 19: ordinal not in range(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)
首先,headers 中的正斜杠对于 ASCII、CSV 文件或 NumPy 不是问题。
我的猜测是 真正的 问题是您的 CSV 是 Latin-1,或者像 Windows-1252 这样的 Latin-1 兼容编码,并且headers 之一包含微符号 µ
,在这些编码中为 0xB5。或者 headers 实际上根本不是问题,并且您在某些数据中有 µ
个字符。
无论哪种方式,使用默认的 ASCII 编码,您都会收到关于 0xb5
不在 range(128)
中的错误,与您问题中的完全一样。
如果您尝试通过显式指定 encoding='utf-8'
来修复此问题,那是错误的编码,您只会得到一个不同的错误,关于 0xb5
是一个无效的起始字节。
如果您通过指定 encoding='latin-1'
修复它,它应该可以工作。
更一般地说,你必须知道你的文件实际上是什么编码,而不是胡乱猜测。特别是如果您在 Windows,其中许多文件将采用您设置为 OEM 代码页的任何编码,而其他文件将采用 UTF-16-LE,而其他文件将采用 UTF -8 但有非法 BOM 等
生成它们的程序应该记录它使用的编码方式,或者有可供您选择的选项。如果没有,您需要尝试,例如,在允许您 select 编码的文本编辑器中查看文件,以尝试找出哪个看起来正确。或者您可以使用 chardet
之类的工具来帮助您猜测。