更具体地说:首先,我首先对文件的行进行一些解析,以便找到例如所有以" x"开头的行。在这样做时,我将找到的行的索引添加到列表中(比如l
)。这是预处理部分。
现在在while循环中,我从l
中选择随机索引,并想要读取其对应的行(或者说它周围有5行)。因此,我需要在整个while循环中将文件保存在内存中,作为先验,我不知道我最终读取了哪些行(该行是从l中随机选取的)。
问题是,当我在主循环之前调用文件时,在第一次循环运行期间,读取成功完成,但是从第二次运行开始,文件已从内存中消失。我尝试过:
预处理部分:
for i, line in enumerate(filename):
prep = ''.join(c for c in line if c.isalnum() or c.isspace())
if 'x' in prep: l.append(i)
现在我有了我的名单。在主循环之前将文件加载到内存中:
with open(filename,'r') as f:
while (some condition):
random_index = random.sample(range(0,len(l)),1)
output_file = open("out","w") #I will write here the read line(s)
for i, line in enumerate(f):
#(the lines to be read, starting from the given random index)
if (i >= l[random_index]) and (i < l[random_index+1]):
out.write(line)
out.close()
只有在循环的第一次运行期间,事情才能正常运行。 或者我也尝试过:
f = open(filename)
while (some condition):
random_index = ... #rest is same as above.
同样的问题,只有第一次运行。有一件事是将f=open(filename)
置于循环中,因此每次运行都会调用该文件。但由于它很大,这实际上是没有实际的解决方案。
答案 0 :(得分:1)
我在这里做错了什么?
This answer解决了同样的问题:您无法两次读取文件。
您在f
循环之外打开文件while
,并在for i, line in enumerate(f):
循环的第一次迭代期间通过调用while
完全读取它。在第二次迭代期间,您无法再次读取它,因为它已经被读过。
这些读数应该如何正确完成?
如链接答案中所述:
要直接回答您的问题,一旦读取了文件,使用
read()
,您可以使用seek(0)
将读取光标返回到文件的开头(文档为here) 。
这意味着,为了解决您的问题,您可以在f.seek(0)
循环的末尾添加while
,以便在每次迭代后将指针移动到文件的开头。这样做可以重新开始重新读取文件。