每次迭代仅使用文件的特定部分

时间:2019-01-29 12:47:58

标签: python python-3.x file-processing

我正在使用Python的外部API(特别是3.x)来基于.txt文件中的某些关键字获取搜索结果。但是,由于在运行该脚本时每个时间间隔可以搜索多少个关键字(假设我需要每小时等待)的限制,我只能使用部分关键字(例如50个关键字)。在Python中,如何在每次迭代中仅使用一部分关键字?

假设我在.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 :(得分:2)

据我所知,没有办法在脚本的不同调用之间保留使用的关键字。但是,对于在脚本的不同调用中实现所需信息的“持久存储”,您确实有两种选择。

  1. 您可能只有两个文件,而不是只有一个名为myWords.txt的输入文件。一个文件包含您要搜索的关键字,另一个文件包含您已搜索的关键字。搜索关键字时,将其从一个文件中删除,然后将它们放置在另一个文件中。
  2. 您可以实施一种operator precedences策略,该策略可以存储单词。
  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

正如我已经说过的那样,您有很多选择,而且我不知道是否有任何一种方法比其他方法更具有Python风格,但是您要尽一切努力使它保持简单。

答案 1 :(得分:0)

尝试一下。根据需要进行修改。

$ 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)))