尝试遍历文本文件行时出现问题

2024-10-05 14:28:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试一些很简单的事情,但我有一个问题我不明白。 基本上我有一个文件,里面有这个表格的文本

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...
=============================

我要做的是把精度在0.90以上的所有3行块写入另一个文件。 为了浏览这些行,我使用了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])

从这里开始我有两个问题我不明白。。。 第一个是

f=oldfile.readlines()[line-2] IndexError: list index out of range

我不明白,当我打印长度是13599,我的模数是3-2=1,没有负数的行

我以前从未遇到的第二个问题是,当我取消对print(len(oldfile.readlines()))行的注释时,当它打印值时,我没有任何错误,但随后停止而不做任何操作。这就像打印正在终止程序,因为它没有进入for循环….
泰铢


Tags: 文件textlenwithlinewritexxxf1
3条回答

你没有理由在这里加载整个文件在内存中。如果以后要处理大文件,可能会导致无用的资源问题。您只需保留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])

不能多次使用oldfile.readlines()

而不是将文件的内容赋给变量,如下所示:

contentOfTheFile = oldfile.readlines()

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

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

相关问题 更多 >