numpy.genfromtxt 处理含有空字符的csv文件

1 投票
1 回答
1102 浏览
提问于 2025-04-18 14:22

我正在做一个科学绘图的脚本,目的是从Agilent的Chemstation软件输出的csv文件中创建图表。

当文件来自一种液相色谱的Chemstation版本时,我的脚本运行得非常顺利。

现在我想把它移植到我们的气相色谱(GC)上。不知道为什么,这个版本的Chemstation在输出的任何文本文件中,每个字符之间都会插入空值。

我想用numpy.genfromtxt把x和y的数据导入到Python中,以便创建图表(使用matplotlib)。

我最开始是这样加载数据的:

data = genfromtxt(directory+signal, delimiter = ',') 

但是当我用我们GC生成的csv文件这样做时,得到的数组全是'nan'值。如果我把数据类型设置为none,我得到的就是像这样的'字节字符串':

b'\x00 \x008\x008\x005\x00.\x002\x005\x002\x001\x007\x001\x00\r'

我需要的是一个浮点数,对于上面的字符串,它应该是885.252171。

有没有人知道我该怎么做才能得到我想要的结果?

另外,我想说明的是,我在Chemstation上找不到任何设置可以影响输出,来避免生成带有空值的文件。

谢谢

杰夫

1 个回答

2

假设你的文件是用utf-16-le编码的,并且有一个字节顺序标记(BOM),而且所有实际的unicode字符(除了BOM)都小于128,那么你可以用一个叫做 codecs.EncodedFile 的工具来把这个文件从utf-16转换成ascii格式。下面这个例子对我来说是有效的。

这是我的测试文件:

$ cat utf_16_le_with_bom.csv 
??2.0,19
1.5,17
2.5,23
1.0,10
3.0,5

文件的前两个字节,fffe 是BOM,表示U+FEFF:

$ hexdump utf_16_le_with_bom.csv 
0000000 ff fe 32 00 2e 00 30 00 2c 00 31 00 39 00 0a 00
0000010 31 00 2e 00 35 00 2c 00 31 00 37 00 0a 00 32 00
0000020 2e 00 35 00 2c 00 32 00 33 00 0a 00 31 00 2e 00
0000030 30 00 2c 00 31 00 30 00 0a 00 33 00 2e 00 30 00
0000040 2c 00 35 00 0a 00                              
0000046

这是我的Python脚本 genfromtxt_utf16.py(为Python 3更新过):

import codecs
import numpy as np

fh = open('utf_16_le_with_bom.csv', 'rb')
efh = codecs.EncodedFile(fh, data_encoding='ascii', file_encoding='utf-16')
a = np.genfromtxt(efh, delimiter=',')
fh.close()

print("a:")
print(a)

在使用python 3.4.1和numpy 1.8.1的情况下,这个脚本可以正常工作:

$ python3.4 genfromtxt_utf16.py 
a:
[[  2.   19. ]
 [  1.5  17. ]
 [  2.5  23. ]
 [  1.   10. ]
 [  3.    5. ]]

要确保你没有把编码指定为 file_encoding='utf-16-le'。如果包含了字节顺序后缀,BOM就不会被去掉,这样就无法转换成ascii格式了。

撰写回答