我有一个文本文件,具有36000个值。每行一个值。 我需要计算8个值的中位数,然后移至下一个8个值,依此类推。这是我到目前为止编写的代码。
num_lines = open('median_raw.txt').read().count('\n')
print(num_lines)
median_values =0
count2 = count1
while count2<=num_lines:
file_name = open("median_raw.txt", 'r+')
f= open('median_parsed' + '.txt', 'w+')
for line_no1, line1 in enumerate (file_name):
median_values=(statistics.median([line1, int(next(line1))]))
f.writelines([median_values])
count2= count2+8
file_name.close()
f.close()
答案 0 :(得分:2)
这是比较惯用的东西。它使用的是来自itertools的islice
,它一次读取第8行,一次仅保存8行。因此,对于较大的文件,您不会看到内存问题。
from itertools import islice
from statistics import median
with open('median_raw.txt') as f, open('median_parsed.txt', 'w+') as fout:
while True:
val = [int(s) for s in islice(f, 8)]
if not val:
break
avg = median(val)
print(f'the median of {val} is {avg}')
fout.write(f'{avg}\n')
即使输入的行数不能被8整除,这也可以正常工作。当islice
返回空列表时,我们将停止迭代。
答案 1 :(得分:0)
也许尝试一下:
Nested Graph
第1行将为您创建一个范围,以8为一组的方式遍历文件。 然后,每个新循环将收集由当前“ bin”调制的0到8的平均值。
这仅在您的起始文件换行长度可被8整除的情况下有效