Используйте только определенную часть файла в каждой итерации - PullRequest
0 голосов
/ 29 января 2019

Я использую внешний API для Python (в частности, 3.x) для получения результатов поиска по определенным ключевым словам, расположенным в файле .txt.Однако из-за ограничения количества ключевых слов, которые я могу искать за каждый промежуток времени (предположим, мне нужно почасовое ожидание), я запускаю сценарий и могу использовать только часть ключевых слов (скажем, 50 ключевых слов).Как я могу, Pythonically, использовать только часть ключевых слов в каждой итерации?

Предположим, у меня есть следующий список ключевых слов в файле .txt myWords.txt:

Lorem #0
ipsum #1
dolor #2
sit   #3
amet  #4
...
vitae #167

Я хочу использовать ключевые слова, найденные в 0-49 (т.е. первые 50 строк) на первой итерации, 50-99 на второй, 100-149 на третьей и 150-167 на четвертой и последней итерации.

Это, конечно, возможно, прочитав весь файл, прочитав счетчик итераций, сохраненный в другом месте, а затем выбрав диапазон ключевых слов, находящихся в этой итерируемой части полного списка.Однако в том, что я хотел бы сделать, я не хочу иметь внешний счетчик, а имею только мой скрипт Python и myWords.txt, где счетчик рассматривается в самом коде Python.

Я хочу использовать только те ключевые слова, которые я должен использовать при текущем запуске сценария (в зависимости от (total number of keywords)/50).В то же время, если я добавлю новые ключевые слова в конце myWords.txt, он должен соответствующим образом скорректировать итерации и, если необходимо, добавить новые итерации.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Насколько я знаю, нет способа сохранить ключевые слова, используемые между различными вызовами вашего скрипта.Однако у вас есть несколько вариантов того, как реализовать «постоянное хранилище» информации, которая вам нужна при различных вызовах сценария.

  1. Вместо того, чтобы просто иметь один входной файл с именем myWords.txt, вы можете иметь два файла.Один файл, содержащий ключевые слова, которые вы хотите найти, и один файл, содержащий ключевые слова, которые вы уже искали.При поиске по ключевым словам вы удаляете их из одного файла и помещаете в другой.
  2. Вы можете реализовать стратегию постоянного хранения , в которой хранятся слова.
  3. (Самая простая вещь, которую я хотел бы сделать) - просто иметь файл с именем next_index.txt и хранить последний индекс из вашей итерации.

Вот реализация того, что я бы сделал:

Создайте следующий файл позиции

echo 0 > next_pos.txt

Теперь сделайте свою работу

with open('next_pos.txt') as fh:
    next_pos = int(fh.read().strip())

rows_to_search = 2 # This would be 50 in your case
keywords = list()
with open('myWords.txt') as fh:
    fh.seek(next_pos)
    for _ in range(rows_to_search):
       keyword = fh.readline().strip()
       keywords.append(keyword)
       next_pos = fh.tell()

# Store cursor location in file.
with open('next_pos.txt', 'w') as fh:
    fh.write(str(next_pos))

# Make your API call
# Rinse, Wash, Repeat

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

0 голосов
/ 29 января 2019

Попробуй это.Изменить для ваших нужд.

$ cat foo
1
2
3
4
5
6
7
8
9
10

cat getlines.py
import sys


def getlines(filename, limit):
    with open(filename, 'r') as handle:
        keys = []
        for idx, line in enumerate(handle):
            if idx % limit == 0 and idx != 0:
                yield keys
                keys = []
            keys.append(line.strip())

print(list(getlines('foo', 2)))
print(list(getlines('foo', 3)))
print(list(getlines('foo', 4)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...