2016-12-05 201 views
0

我试图从.dat文件读取一些模拟结果并分析它们。 这些文件有如下结构:将字符串数组转换为浮点数组

N o d a l D i s p l a c e m e n t s  Time  0.10000E+01 
              Prop. Ld. 1.00000E+00 

Node  1 Coord  2 Coord  3 Coord  1 Displ  2 Displ  3 Displ 
    1 0.0000E+00 5.0000E-01 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 

    2 0.0000E+00 2.5005E-01 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 

    3 0.0000E+00 1.0000E-04 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 
    4 1.0000E+00 5.0000E-01 0.0000E+00 -1.9511E-04 4.0845E-04 -2.1522E-05 

    5 1.0000E+00 2.5005E-01 0.0000E+00 1.1185E-08 4.0053E-04 2.6545E-09 

    6 1.0000E+00 1.0000E-04 0.0000E+00 1.9511E-04 4.0847E-04 2.1526E-05 

    7 2.0000E+00 5.0000E-01 0.0000E+00 -3.5177E-04 1.5287E-03 -1.2678E-05 

...等等之一。

如何将数值数据转换为浮点型和删除字符串? 我用下面的代码试了一下:

class DataLoader: 
    def __init__(self, number_files): 
     self.number_files = number_files 

    def loader(self): 
     array = [] 

     for i in range(1, self.number_files + 1): 
      try: 
       if i < 10: 
        data = open("ndis_00%s.dat" % i, "r") 
       elif i >= 10 and i <= 100: 
        data = open("ndis_0%s.dat" % i, "r") 
      except IOError: 
       print("I/O Error") 

      for line in data: 
       if line != "\n": 
        array.append(line.split()) 
        try: 
         float(line) 
        except (ValueError, TypeError): 
         line[:] = [] 
        print(line) 

在我要保留转换为浮动行的代码,并且不转换,可以完全删除的字符串。

回答

0

如果文件的结构如上所述,那么包含所需数据的行将不是空的,也不会以字母字符开头。可以利用这一点如下:

def extractData(f): 
    data = [] 
    for line in f: 
     line = line.strip() 
     if len(line) == 0 or line[0].isalpha(): continue 
     items = line.split() 
     data.append([float(item) for item in items[1:]]) 
    return data 

上述函数采用这样的文件,并返回包含您感兴趣的浮点数据的2维的Python阵列(列表的列表)

为了测试(其中test.dat包含示例数据):

with open('test.dat') as testf: 
    nums = extractData(testf) 
    for row in nums: print(row) 

输出:

[0.0, 0.5, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.25005, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0001, 0.0, 0.0, 0.0, 0.0] 
[1.0, 0.5, 0.0, -0.00019511, 0.00040845, -2.1522e-05] 
[1.0, 0.25005, 0.0, 1.1185e-08, 0.00040053, 2.6545e-09] 
[1.0, 0.0001, 0.0, 0.00019511, 0.00040847, 2.1526e-05] 
[2.0, 0.5, 0.0, -0.00035177, 0.0015287, -1.2678e-05] 

如果这不起作用 - 您没有充分定义文件的结构。

+0

谢谢。而已。 – ingenium