2016-03-14 5 views
0
inputs=[] 
def pickinputs():   
search_chars=['WaveDir', 'WaveHs', 'WaveTp', 'WtrDpth', 'Number of mooring lines', 'Reference height', 'Reference wind speed', 'Grid height', 'Grid width', 'Analysis time']   
files=[file_platform, file_wind, file_primary] 
m=0 
while True: 
    inputfile=open(files[m],'r')   
    for i in range(len(search_chars)):   
     j=1 
     for lines in inputfile: 
      if search_chars[i] in lines: 
       line= linecache.getline(files[m], j) 
       line_split = line.split(' ') 
       #print (line_split) 
       for k in range(len(line_split)): 
        if line_split[k]!= "": 
         break 
        val=line_split[k+1] 
       inputs.append(val) 
      j=j+1 
    m=m+1 

Целью является поиск каждого текста search_chars в файлах и получение его номера строки в этом файле (в файлах) и разбиение на чтение первого непространственного значения (это число) и добавить его к входам. Я мог бы написать то же самое побольше, но я хотел бы сделать это эффективным образом. Search_chars может присутствовать в любом из файлов.поиск массива ключевых слов в массиве файлов

Может ли кто-нибудь предложить изменения в коде, который я написал, чтобы он работал эффективно? Благодаря

+1

Я могу сделать предложение сделать код работать _at all_: 'file' объекты являются итераторами, и как только вы его повторили один раз, он исчерпан, поэтому вы можете найти только совпадения на самой первой итерации вашего самого внешнего цикла , Чтобы исправить это, вы можете поменять циклы 'for i' и' for lines' или открыть файл заново в цикле 'for i' или кэшировать содержимое файлов в списках, если они не слишком большие. –

+0

Кроме того, для всех этих 'for x in range (len (...))' вы должны делать 'for x in ...' непосредственно, или 'for i, x в enumerate (...)', если вы нужен индекс. Кроме того, что такое 'linecache'? –

+0

Не могли бы вы отредактировать вопрос, чтобы включить небольшой образец ввода и вывода? –

ответ

1

Вы могли бы сделать что-то вроде следующего:

inputs = [] 
search_strings = ['WaveDir', 'WaveHs', 'WaveTp', 'WtrDpth', 'Number of mooring lines', 'Reference height', 'Reference wind speed', 'Grid height', 'Grid width', 'Analysis time'] 
files = ['input.txt', 'input2.txt'] 

for filename in files: 
    with open(filename) as f_input: 
     for line_number, line in enumerate(f_input, start=1): 
      for search in search_strings: 
       if search in line: 
        first_non_space = line.strip().split(' ')[0] 
        inputs.append((filename, line_number, search, first_non_space)) 
        #print filename, line_number, search 

for filename, line_number, search_matched, first_non_space in inputs:    
    print filename, line_number, search_matched, first_non_space 

Это застроить inputs список со всеми матчами, давая вам первое значение не является пространством filename, line_number, search_matched и в строке для всех файлов, которые вы ищете.

+0

Спасибо за переписывание кода. Это имеет смысл и понятно. – KGV

Смежные вопросы