我正在尝试一些非常简单的事情,但我有一些问题,我不明白。 基本上我有一个用这个表格填充文本的文件
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
答案 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()