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

我正在尝试从.mdb文件中提取表,然后过滤该表并将结果吐出到短的.csv文件中。到目前为止,我已经能够提取所需的表并将其内容保存到.CSV中。但是我不知道如何对数据进行排序并提取所需的必要行。我想我可以保存整个.csv,然后重新打开它,但是由于我需要处理大约2000个mdb文件,所以它将占用大量空间。我只想提取某些行。


Cycle Test_Time  Current    Voltage

1     7.80E-002 0.00E+000   1.21E-001

1     3.01E+001 0.00E+000   1.19E-001

1     6.02E+001 0.00E+000   1.17E-001

2     9.02E+001 0.00E+000   1.14E-001

2     1.20E+002 0.00E+000   1.11E-001

2     1.50E+002 0.00E+000   1.08E-001

2     1.80E+002 0.00E+000   1.05E-001

2     2.10E+002 0.00E+000   1.02E-001

3     2.40E+002 0.00E+000   9.93E-002

3     2.70E+002 0.00E+000   9.66E-002

3     3.00E+002 0.00E+000   9.38E-002

3     3.10E+002 4.00E-001   1.26E+000

例如,在上表中,我想做以下事情:

  1. 提取每个周期的最后一行,或更高级的是,按时间对周期进行排序,并提取具有最新时间的周期的行。如您所见,由于我们的测试机故障,最后一行并非总是具有最新时间,但通常会如此。但是数字越大,时间越晚。

  2. 提取最后五个周期的所有行。

  3. 提取循环4到循环30中的所有行。

这是我的代码:

import sys, subprocess, glob


mdbfiles = 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()


一只名叫tom的猫
浏览 166回答 1
1回答

Qyouu

不处理行的平面列表,而是将其转换为一种结构,可以更轻松地首先“查询”数据,可能会更容易。类似于字典列表,其中每个字典代表一个周期:cycles = {}rows = contents.splitlines()  # split the `contents` text blob into individual linesfor 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'])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python