2016-12-11 6 views
0

Мой набор данных имеет случайные размеры, поэтому я хочу использовать exec() или eval() для чтения в моих данных. Вот мой код:Python: как использовать добавление случайных чисел параметра в список

tim = [] 
var = [] 
for line in open(fid).readlines(): 
    str = line.split() 
    if line.find('/') >= 0: 
     tim.append(datetime.strptime(str[0]+str[1],'%Y/%m/%d%H:%M:%S')) 
     depth = int(str[2]) 
     num = 0 
    else: 
     if num == 0: 
      for i in range(len(str)): exec('var_%02d = []' %(i)) 
     for i in range(len(str)): exec('var_%02d.append(str[%d]) ' % (i,i)) 
     num += 1 
     if num == depth-1:    
      var.append([eval('var_%02d' % i) for i in range(len(str))]) 

Формат данных выглядит следующим образом:

2010/01/01 00:00:00 6 2 
    10 20 
    15 22 
    20 30 
    25 28 
    35 17 
    40 35 

Иногда данные могут добавить еще один столбец и выглядит следующим образом:

2010/01/01 00:00:00 6 2 
    10 20 18 
    15 22 21 
    20 30 30 
    25 28 28 
    35 17 17 
    40 35 32 

Вообще, мой код работает отлично , Но если я хочу сделать, как функцию, она не работает. Кто-нибудь знает, как добавить случайные числа параметров вместе в список?

ответ

0

Вам не нужно использовать exec, на самом деле вы должны никогда использовать exec. Используйте многомерный массив (массив массивов), чтобы собрать ваши номера:

tmp = [] 
tim = [] 
var = [] 
for line in open(fid).readlines(): 
    str = line.split() 
    if line.find('/') >= 0: 
     tim.append(datetime.strptime(str[0]+str[1],'%Y/%m/%d%H:%M:%S')) 
     depth = int(str[2]) 
     num = 0 
    else: 
     if num == 0: 
      for i in range(len(str)): 
       if len(tmp) <= i: 
        tmp.append([]) 
     for i in range(len(str)): 
      tmp[i].append(str[i]) 
     num += 1 
     if num == depth-1: 
      var.append([tmp[i] for i in range(len(str))]) 

print(var) 

Для первого набора данных он будет печатать:

[[['10', '15', '20', '25', '35', '40'], ['20', '22', '30', '28', '17', '35']]] 

И второе:

[[['10', '15', '20', '25', '35', '40'], ['20', '22', '30', '28', '17', '35'], ['18', '21', '30', '28', '17', '32']]]