Python-如何同时读取多个文件并保留数据记录

时间:2016-05-09 03:09:05

标签: python dictionary

我是Python的新手。我有10个输入文件,格式如下所示。每个文件包含接收器(接收器1-10)的测量数据。每个接收器都有10个发射器(发射器1-10)的测量值。这些文件按时间顺序排列,时间以秒为单位。

我想逐行同时阅读10个文件。在读取文件时,我想从每个发送器的每个文件中收集4个测量值,并平均这些值以获得每个接收器 - 发送器对的4秒平均值。我想跟踪每个接收器 - 发射器对的每个平均值。一旦我为特定接收器收集了所有发射器的4秒平均值,我想平均这些值以获得该接收器的平均值。我还想跟踪这些平均值(时间平均值和测量平均值)以及它们属于哪个接收器。

我无法将这些文件加载​​到内存中,因为文件很大(大约为千兆字节)。由于文件的大小,将所有平均值保留在内存中也是一个问题。我只想为每个接收器 - 发送器对保留一小时的数据,以获得内存中的平均值。一旦我有一个小时的平均值,当计算新的平均值时,我想丢弃最旧的值。

我认为字典可能是跟踪数据的最佳方式。

我如何完成上述任务?

输入文件:

列格式:时间(秒)发送器#测量

 0.0  1 2.4779E+02
 0.0  2 2.8147E+02
 0.0  3 2.7437E+02
 0.0  4 2.6661E+02
 0.0  5 2.2637E+02
 0.0  6 2.1457E+02
 0.0  7 2.3750E+02
 0.0  8 2.9573E+02
 0.0  9 2.7339E+02
 0.0 10 2.4982E+02
 1.0  1 2.1086E+02
 1.0  2 2.7459E+02
 1.0  3 2.1569E+02
 1.0  4 2.0018E+02
 1.0  5 2.8732E+02
 1.0  6 2.2633E+02
 1.0  7 2.2900E+02
 1.0  8 2.6883E+02
 1.0  9 2.4482E+02
 1.0 10 2.8314E+02
 2.0  1 2.6987E+02
 2.0  2 2.5946E+02
 2.0  3 2.8195E+02
 2.0  4 2.3097E+02
 2.0  5 2.2592E+02
 2.0  6 2.5316E+02
 2.0  7 2.5562E+02
 2.0  8 2.5892E+02
 2.0  9 2.1258E+02
 2.0 10 2.5791E+02

2 个答案:

答案 0 :(得分:2)

您可以使用python中的FileObject.readline()并行访问文件。

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
fo1 = open("foo1.txt", "rw+")

line = fo.readline()
print "Read Line from foo: %s" % (line)

line = fo1.readline()
print "Read Line from foo1: %s" % (line)

# Close opend file
fo.close()
fo1.close()

同样,您可以为10个不同的输入文件使用10个对象,并在每个文件上使用readline。希望这会有所帮助。

对于您的问题陈述,可以读取每个发送器的每个文件的测量值并平均这些值以获得每个接收器 - 发送器对的4秒平均值。要跟踪每个接收器 - 发送器对的每个平均值,请创建一个字典或自定义列表。然后为接收器构建逻辑以获得最终结果/值。但请确保,一旦他们不再需要,您就会删除字典/列表中的数据。希望这会有所帮助。

答案 1 :(得分:1)

许多Python工具都会有所帮助:

  • 将样本放入defaultdict,其中每个项目都是一个列表,键入发射机ID
  • 使用glob列出目录中的所有数据文件
  • 使用namedtuple s,我们可以为每个数据位赋予一个名称,这比简单的列表或元组更容易阅读

并行打开数据文件,存储每个发送器的样本列表

#!/usr/bin/env python

'''
averagetrans -- calculate receiver/transmitter averages
'''
import collections
import glob
import sys

ReceiverData = collections.namedtuple(
    'ReceiverData',
    ['path', 'time_sec', 'transmitter', 'measurement'])

def parse_data(path, line):
    words = line.rstrip().split()
    return ReceiverData(
        path=path,
        time_sec=words[0],
        transmitter=words[1],
        measurement=float(words[2]))


transmitter_data = collections.defaultdict(list)

files = dict((path, open(path))
             for path in glob.glob('receiver*.csv'))

while True:
    for rpath, rfile in files.iteritems():
        line = rfile.readline()
        if not line:
            sys.exit(0)
        datum = parse_data(rpath, line)

        cur_data = transmitter_data[datum.transmitter]
        # take most recent four samples
        cur_data.append(datum)
        cur_data = cur_data[-4:]

        average = sum(dat.measurement for dat in cur_data) / len(cur_data)

        print 'trans {}: average {}'.format(
                 datum.transmitter,
            average)
        # print '\t- data: {}'.format(cur_data)

输出每个发射机的4个样本平均值

trans 4: average 200.18
trans 1: average 247.79
trans 5: average 287.32
trans 2: average 281.47
trans 6: average 226.33
trans 3: average 274.37
trans 7: average 229.0
trans 4: average 233.395
trans 8: average 268.83
trans 5: average 256.845
trans 9: average 244.82
trans 6: average 220.45
trans 10: average 283.14
trans 7: average 233.25
trans 1: average 258.83
trans 8: average 282.28
trans 2: average 270.465
trans 9: average 259.105
trans 3: average 278.16
trans 10: average 266.48
trans 4: average 232.586666667
trans 1: average 242.84
trans 5: average 246.536666667
trans 2: average 271.84
trans 6: average 231.353333333
trans 3: average 257.336666667
trans 7: average 240.706666667