2016-10-20 2 views
0

У меня есть файл, содержащий x количество значений, каждое в своей строке. Мне нужно принять n номер значения из этого файла, поместить его в массив, передать этот массив в новый процесс, очистить массив и затем взять еще n количество значений из файла, чтобы перейти к следующему процессу ,Python - обрабатывать кусок строк в файле

Проблема, с которой я столкнулся, заключается в том, что x - это значение, подобное 12, и я пытаюсь дать, скажем, 10 кусков значений каждого процесса.

Первый процесс получит первые 10 значений без проблем, но у меня проблемы с оставшимися 2 до последнего процесса.

Проблема также возникнет, если, скажем, вы сообщите программе, чтобы дать каждому процессу 10 значений из файла, но файл имеет только 1 или даже 9 значений.

Мне нужно знать, когда я в последний набор значений, которые меньше, чем n

Я хочу, чтобы не принимать все значения в файле и хранить его в массиве все сразу, так как я мог бы работать в проблемы с памятью, если в этом файле было миллионы значений.

Вот пример того, что я пытался сделать:

chunk = 10 
value_list = [] 
with open ('file.txt', 'r') as f: 
    for value in f: 
     value_list.append(value) 
     if (len(value_list) >= chunk): 
      print 'Got %d' % len(value_list) 
      value_list = [] # Clear the list 
      # Put array into new process 

Это будет ловить каждый 10 в этом примере, но это не будет работать, если даже случилось быть менее 10 в файле, чтобы начать с.

+0

просто использовать оставшиеся данные из 'value_list' после вашего цикла делается для вызова процесса в последний раз (если' value_list' не пуст) –

ответ

1

То, что я обычно делаю в этой ситуации, просто обрабатывает последний (короткий) массив после цикла for. Например,

chunk = 10 
value_list = [] 
with open ('file.txt', 'r') as f: 
    for value in f: 
     if (len(value_list) >= chunk): 
      print 'Got %d' % len(value_list) 
      value_list = [] # Clear the list 
      # Put array into new process 
     value_list.append(value) 
    # send left overs to new process 
    if value_list: 
     print 'Got %d' % len(value_list) 
     # Put final array into new process 
+0

Я редактировал свой пост, чтобы включить 'value_list. добавление (значение) '. Не знаю, почему этого не было. Просто хотел указать, что если у вас есть значение value_list.append (value) 'внутри этого еще, как у вас есть, оно заканчивается тем, что пропускает значение n n, если оно срабатывает хотя бы один раз. –

+1

Вышеприведенный код имеет логическую ошибку - он пропускает одну строку каждый раз, когда достигает «chunk'size». Решение: переместите 'append' из ветки' else'. –

+0

@ShaunAran, bruno, хороший улов! Спасибо вам обоим. Я исправил пример. –

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