Python-如何同时读取多个文件并记录d的方法

2024-06-28 11:05:28 发布

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

我是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

Tags: 文件数据内存字典字节格式记录时间
2条回答

你可以用文件对象.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秒的平均值。要跟踪每个收发两用机对的每个平均值,请创建字典或自定义列出。然后为接收者构建逻辑以获得最终结果/值。但请确保,一旦数据不再存在,就从字典/列表中删除它们需要。希望这有帮助。在

一些Python工具将有助于:

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

并行打开数据文件,按变送器存储样本列表

#!/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个采样平均值输出

^{pr2}$

相关问题 更多 >