当空或单行时,Python读取numpy数组中的文本文件

时间:2012-10-11 15:50:32

标签: python numpy

我正在使用以下代码阅读文本文件:

import numpy as np
my_data = np.genfromtxt(resultsDirectory+'/Points.txt', delimiter=' ')
PointX = my_data[:,5]
PointY = my_data[:,11]

我的输入文件通常是这样的 -

ParamA : 0 ParamB : 7 ParamC : 0 ParamD : 1 Result : FAIL Time : 0 Epsilon : 0.5
ParamA : 0 ParamB : 11 ParamC : 0 ParamD : 1 Result : FAIL Time : 2 Epsilon : 0.5
ParamA : 0 ParamB : 7 ParamC : 0 ParamD : 3 Result : FAIL Time : 2 Epsilon : 0.25
ParamA : 0 ParamB : 13 ParamC : 0 ParamD : 1 Result : FAIL Time : 7 Epsilon : 0.25
ParamA : 0 ParamB : 7 ParamC : 0 ParamD : 4 Result : FAIL Time : 8 Epsilon : 0.125
ParamA : 0 ParamB : 8 ParamC : 0 ParamD : 2 Result : FAIL Time : 1 Epsilon : 0.125
ParamA : 0 ParamB : 8 ParamC : 0 ParamD : 3 Result : FAIL Time : 3 Epsilon : 0.125
ParamA : 0 ParamB : 8 ParamC : 0 ParamD : 4 Result : FAIL Time : 6 Epsilon : 0.125
ParamA : 0 ParamB : 9 ParamC : 0 ParamD : 2 Result : FAIL Time : 6 Epsilon : 0.125
ParamA : 0 ParamB : 10 ParamC : 0 ParamD : 2 Result : FAIL Time : 5 Epsilon : 0.125
ParamA : 0 ParamB : 14 ParamC : 0 ParamD : 1 Result : FAIL Time : 6 Epsilon : 0.125

当我从中提取PointX时,我得到了

PointX = [7 11 7 13 7 8 8 8 9 10 14]
PointY = [1 1 3 1 4 2 3 4 2 2 1]

现在,有时我的文本文件只包含一行或甚至是空的。

例如,如果文本文件只有一行,则my_data数组就像这样 -

[  nan   nan   0.    nan   nan   7.    nan   nan   0.    nan   nan   1.
   nan   nan   nan   nan   nan  0.    nan   nan   0.5]

在这种情况下,my_data.shape会返回(21,)

但是,阅读数组PointXPointY会给我一个错误IndexError: invalid index。我想要PointX=[7]PointY=[1]。或者,如果文本文件为空,则应为PointX=[]PointY=[]

我究竟应该如何解决这个问题?另外,我需要将PointXPointY作为数组,以免破坏依赖于它的代码。

谢谢。

2 个答案:

答案 0 :(得分:3)

不幸的是,如果给定的文件只有一行,genfromtxt会返回一维数组,如果给定多行,则返回一个二维数组。您可以通过重塑来处理差异:

import numpy as np
my_data = np.genfromtxt('data', delimiter=' ')
if my_data.ndim == 1:
    my_data = my_data.reshape(1, -1)
PointX = my_data[:,5]
PointY = my_data[:,11]
print(PointX)
print(PointY)

产量

[ 7.]
[ 1.]

答案 1 :(得分:2)

处理空文件:

import numpy as np
try:
    my_data = np.genfromtxt('data_file', delimiter=' ')
    if my_data.ndim == 1:
        my_data = my_data.reshape(1, -1)
    PointX = my_data[:,5]
    PointY = my_data[:,11]
except IOError: # File is empty
    PointX = []
    PointY = []

print(PointX)
print(PointY)