尝试迭代文本文件行时出现问题

时间:2017-03-29 08:28:50

标签: python iteration text-files

我正在尝试一些非常简单的事情,但我有一些问题,我不明白。 基本上我有一个用这个表格填充文本的文件

Text Accuracy: 0.568221 F1 = 22 recall=0.54
with paramters A=xxx B=11 C=222...
=============================
Text Accuracy: 0.568221 F1 = 22 recall=0.54
with paramters A=xxx B=11 C=222...
=============================
Text Accuracy: 0.568221 F1 = 22 recall=0.54
with paramters A=xxx B=11 C=222...
=============================
Text Accuracy: 0.568221 F1 = 22 recall=0.54
with paramters A=xxx B=11 C=222...
=============================
Text Accuracy: 0.568221 F1 = 22 recall=0.54
with paramters A=xxx B=11 C=222...
=============================

我想要做的是在另一个文件中写出3行精度高于0.90的所有块。 为了浏览我使用的解决方案here。 我的代码如下:

with open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree.txt') as oldfile, open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree2.txt', 'w') as newfile:
     #print(len(oldfile.readlines()))
     for line in range(1,int(len(oldfile.readlines()))):
         print(line)
         if line%3==0:
             f=oldfile.readlines()[line-2]
             f=f.split(' ')[3]
             if int(f)>0.90:
                 newfile.write(oldfile.readlines()[line-2])
                 newfile.write(oldfile.readlines()[line-1])
                 newfile.write(oldfile.readlines()[line])

从这里开始我有2个问题,我不明白...... 第一个是

  

f = oldfile.readlines()[line-2] IndexError:列表索引超出范围

当我打印长度为13599时,我不明白,我的模数正在工作,因此3-2 = 1,没有负数行

我之前从未得到的第二个问题是,当我取消注释print(len(oldfile.readlines()))行时,我没有错误,因为它打印了值,但是然后停止而没有做任何事情。这就像打印正在杀死程序,因为它没有进入for循环.... THX

4 个答案:

答案 0 :(得分:2)

readlines()将文件指针前进到文件的末尾,因此除非文件在此期间被放大,否则任何进一步的调用都不会产生任何结果。相反,将所有行读入内存(使用the iterator protocol),然后索引。此外,您的解析不正确。

# Make sure to correctly escape backslashes!
old_fn = 'G:\\Mayeul\\Distribution images\\Features_importance\\LogDecisionTree.txt'
new_fn = 'G:\\Mayeul\\Distribution images\\Features_importance\\LogDecisionTree2.txt'

with open(old_fn) as oldfile:
     old_lines = list(oldfile)

with open(new_fn, 'w') as newfile:
     print(len(old_lines))
     for line in range(1, len(old_lines)):
         print(line)
         if line % 3 == 0:
             f = old_lines[line-2]
             accuracy = f.split(' ')[2]
             if float(accuracy) > 0.90:
                 newfile.write(old_lines[line-2])
                 newfile.write(old_lines[line-1])
                 newfile.write(old_lines[line])

答案 1 :(得分:2)

这里没有理由将整个文件加载到内存中。如果您以后想要处理大文件,可能会导致无用的资源问题。你只需要保留3行:

with open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree.txt') as oldfile, open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree2.txt', 'w') as newfile:
     #print(len(oldfile.readlines()))
     oldlines = [None] * 3   # reserve a storage for 3 lines
     for linenum, line in enumerate(oldfile, 1):
         oldlines[linenum%3] = line    # actually store the line
         if linenum%3==0:
             f = oldlines[1]
             f=f.split(' ')[2]
             if float(f)>0.90:
                 newfile.write(oldlines[1])
                 newfile.write(oldlines[2])
                 newfile.write(oldlines[0])

答案 2 :(得分:0)

您不能多次使用 oldfile.readlines()

而不是将其分配给变量,如下所示:

contentOfTheFile = oldfile.readlines()

并在代码中使用此变量而不是oldfile.readlines()

答案 3 :(得分:0)

试试这个。

f = open("Input file path")

l = f.read().split("=============================")

for each_line in l:
    if each_line.strip():
        print(each_line.split()[2])

f.close()