Python:从文本文件

时间:2018-01-30 14:55:08

标签: python-3.x

我使用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 bla

     

FIRST some string 1

     

10 10

     

15 20

     

5 2.5

     

SECOND some string 2

     bla bla bla

     bla bla bla

     

FIRST 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'时停止第一次迭代。

有人怎么做?当事情不清楚时,请告诉我。

1 个答案:

答案 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

这看起来就像你正在尝试的一样。