我使用Python 3.6从两个字符串之间的文本文件中循环提取数据。我有多个字符串,我想在这些字符串之间提取数据,请参阅下面的代码:
for i in range(0,len(strings1)):
with open('infile.txt','r') as infile, open('outfile.txt', 'w') as outfile:
copy = False
for line in infile:
if line == strings1[i]:
copy = True
elif line == strings2[i]:
copy = False
elif copy:
outfile.write(line)
continue
为了减少循环的处理时间,我想修改我的代码,以便在两个字符串之间提取数据之后,让我们说出strings1 [1]和strings2 [1],它会记住该行strings2 [1]的索引并在该行索引处开始循环的下一次迭代。因此,它不必在每次迭代期间读取整个文件。构建字符串列表使得先前的字符串永远不会出现在当前字符串之后,因此将我的代码修改为我想要的并且不会破坏循环。
有人怎么做?
=============================================== ============================
编辑:
我的文件格式如下:
第一行
bla bla blaFIRST some string 1
10 10
15 20
5 2.5
SECOND some string 2
bla bla bla bla bla blaFIRST some string 3
10 10
15 20
5 2.5
SECOND some string 4
这个文件对于很多行都是这样的。
我想在第一个字符串1'之间提取数据。和' SECOND一些字符串2',并绘制此数据。完成后,我想对' FIRST某些字符串3'之间的数据做同样的事情。并且' SECOND一些字符串4' (因此也绘制数据)。所有' FIRST一些字符串..'存储在strings1列表中,并且所有' SECOND存储在一些字符串中。'存储在strings2列表中。
为了减少计算时间,我想修改代码,使得在第一次迭代之后,它知道它可以从带有字符串'某些字符串2'而不是来自第一行'而且,当在第一次迭代期间,它知道它可以在找到' SECOND某些字符串2'时停止第一次迭代。
有人怎么做?当事情不清楚时,请告诉我。
答案 0 :(得分:0)
关键问题是你在for循环中重新打开你的文件,当然它每次都会从头开始重复这些文件。我不会{for}循环中的open
文件,这非常低效。您可以先将文件加载到内存中,然后循环遍历strings1
。
还有一些其他问题,即:
copy = False
for line in infile:
if line == strings1[i]:
copy = True
elif line == strings2[i]:
copy = False
elif copy:
outfile.write(line)
continue
elif copy:
行永远不会在第二个循环的第一次迭代中执行,因为一旦满足True
,复制只能line == strings1[i]
。满足该条件后,对于剩余的迭代,它将始终将行从infile
写入outfile。除非这正是你想要实现的,否则逻辑不起作用。
如果没有完整的背景,很难理解你究竟在寻找什么。 但也许你想要做的只是这样:
with open('infile.txt','r') as infile, open('outfile.txt', 'w') as outfile:
for line in infile.readlines():
if line.rstrip('\n') in strings1:
outfile.write(line)
此代码正在做什么:
1。)将两个文件打开到内存中
2.)迭代line
的{{1}}
3.)检查迭代的infile
,剥离尾部换行符是否在列表line
中,假设您的strings1
是一个没有任何尾随换行符的列表。如果strings1
中的每个项目都有一个尾随strings1
,则不要\n
rstrip
。
4.)如果line
中出现line
,请将strings1
写入line
。
这看起来就像你正在尝试的一样。