numpy.genfromtxt带有空字符的csv文件

时间:2014-07-23 01:00:55

标签: python numpy

我正在制作科学图表脚本,旨在通过安捷伦的Chemstation软件输出的csv文件创建图表。

当文件来自一个版本的Chemstation(用于液相色谱的版本)时,我得到了完美的脚本。

现在我正尝试将其移植到我们的GC(气相色谱仪)上。出于某种原因,这个版本的chemstation在它输出的任何文本文件中的每个字符之间插入空值。

我尝试使用numpy.genfromtxt将x,y数据导入python以创建图形(使用matplotlib)。

我最初使用过:

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

加载数据。当我使用GC生成的csv文件执行此操作时,我得到了一个包含所有' nan'值。如果我将dtype设置为none,我会得到'字节字符串'看起来像这样:

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

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

任何人都知道如何才能到达我需要去的地方?

为了清楚起见,我无法在Chemstation上找到任何会影响它输出的设置,只是不创建带空值的文件。

由于

杰夫

1 个答案:

答案 0 :(得分:2)

鉴于您的文件编码为带有BOM的utf-16-le,并且所有实际的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'。如果包含endian后缀,则不会剥离BOM,也不能将其转码为ascii。