为了账号安全,请及时绑定邮箱和手机立即绑定

需要帮助在Linux机器上的Python中对已处理的mdb文件进行排序

需要帮助在Linux机器上的Python中对已处理的mdb文件进行排序

一只名叫tom的猫 2021-03-28 10:54:58
我正在尝试从.mdb文件中提取表,然后过滤该表并将结果吐出到短的.csv文件中。到目前为止,我已经能够提取所需的表并将其内容保存到.CSV中。但是我不知道如何对数据进行排序并提取所需的必要行。我想我可以保存整个.csv,然后重新打开它,但是由于我需要处理大约2000个mdb文件,所以它将占用大量空间。我只想提取某些行。Cycle Test_Time  Current    Voltage1     7.80E-002 0.00E+000   1.21E-0011     3.01E+001 0.00E+000   1.19E-0011     6.02E+001 0.00E+000   1.17E-0012     9.02E+001 0.00E+000   1.14E-0012     1.20E+002 0.00E+000   1.11E-0012     1.50E+002 0.00E+000   1.08E-0012     1.80E+002 0.00E+000   1.05E-0012     2.10E+002 0.00E+000   1.02E-0013     2.40E+002 0.00E+000   9.93E-0023     2.70E+002 0.00E+000   9.66E-0023     3.00E+002 0.00E+000   9.38E-0023     3.10E+002 4.00E-001   1.26E+000例如,在上表中,我想做以下事情:提取每个周期的最后一行,或更高级的是,按时间对周期进行排序,并提取具有最新时间的周期的行。如您所见,由于我们的测试机故障,最后一行并非总是具有最新时间,但通常会如此。但是数字越大,时间越晚。提取最后五个周期的所有行。提取循环4到循环30中的所有行。这是我的代码:import sys, subprocess, globmdbfiles = glob.glob('*.res')for DATABASE in mdbfiles:     subprocess.call(["mdb-schema", DATABASE, "mysql"])    table_names = subprocess.Popen(["mdb-tables", "-1", DATABASE],                                   stdout=subprocess.PIPE).communicate()[0]    tables = table_names.splitlines()    sys.stdout.flush()    a=str('Channel_Normal_Table')    for table in tables:        if table != '' and table==a:            filename = DATABASE.replace(".res","") + ".csv"            file = open(filename, 'w')            print("Dumping " + table)            contents = subprocess.Popen(["mdb-export", DATABASE, table],                                        stdout=subprocess.PIPE).communicate()[0]            # I NEED TO PUT SOMETHING HERE TO SORT AND EXTRACT THE DATA I NEED            file.write(contents)            file.close()
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

不处理行的平面列表,而是将其转换为一种结构,可以更轻松地首先“查询”数据,可能会更容易。类似于字典列表,其中每个字典代表一个周期:


cycles = {}


rows = contents.splitlines()  # split the `contents` text blob into individual lines


for row in rows[1:]:  # the first line in your question is a header - [1:] skips it

    row = rows.split()  # split each line by whitespace

    cycle = cycles.setdefault(row[0], {'id': row[0], 'rows': []}

    cycle['rows'].append({'cycle':row[0], 'test_time': row[1], 'current': row[2], ...})

然后,您可以按test_time对它们进行排序:


for key, cycle in cycles.items():

    cycles['rows'].sort(key=itemgetter('test_time'))

然后,您可以处理您的数据。每个周期的最后一行:


 for key, cycle in cycles.items():

    output_row(cycles['rows'][-1])

最近五个周期的行:


 for key, cycle in sorted(cycles.items())[:-5]:

    output_rows(cycles['rows'])

从4到30中提取行:


for idx in range(4, 31):

    cycle = cycles[str(idx)]

    output_rows(cycles['rows'])


查看完整回答
反对 回复 2021-04-02
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信