根据源文件重新排列文件中的行

时间:2019-06-07 15:57:31

标签: python python-3.x

我有一个文件A,描述了如下所示的行顺序:

ddr_mode,8,#tc_reg
gasket_ratio,7,#tc_reg
txX_ropll_refsel_override,0,#tc_reg,4
mpllb_word_clk_en,0,#tc_reg
mplla_word_clk_en,1,#tc_reg

我有另一个文件B,我需要按照文件A定义的顺序从中提取行。文件B看起来像这样:

tc gen3_ddr_mode       8
tc gen3_ddr_mode       8
tc gen3_gasket_ratio       7
tc gen3_gasket_ratio       7
tc gen3_mplla_word_clk_en       1
tc gen3_mplla_word_clk_en       1
tc gen3_mpllb_word_clk_en       0
tc gen3_mpllb_word_clk_en       0
tc tx0_ropll_refsel_override  0
tc tx1_ropll_refsel_override  0
tc tx2_ropll_refsel_override  0
tc tx3_ropll_refsel_override  0
tc tx0_ropll_refsel_override  0
tc tx1_ropll_refsel_override  0
tc tx2_ropll_refsel_override  0
tc tx3_ropll_refsel_override  0

输出文件应如下所示:

tc gen3_ddr_mode       8
tc gen3_gasket_ratio       7
tc tx0_ropll_refsel_override  0
tc tx1_ropll_refsel_override  0
tc tx2_ropll_refsel_override  0
tc tx3_ropll_refsel_override  0
tc gen3_mpllb_word_clk_en       0
tc gen3_mplla_word_clk_en       1
tc gen3_ddr_mode       8
tc gen3_gasket_ratio       7
tc tx0_ropll_refsel_override  0
tc tx1_ropll_refsel_override  0
tc tx2_ropll_refsel_override  0
tc tx3_ropll_refsel_override  0
tc gen3_mpllb_word_clk_en       0
tc gen3_mplla_word_clk_en       1

请注意,文件A如何定义顺序以及如何从文件B中提取数据。另外,请注意txX_ropll_refsel_override,0,#tc_reg,4被提取4次。最后的 4 表示应提取的次数。在Python中有更好的方法吗?

EDIT ===== 我尝试使用以下代码将文件A中的任何关键字与文件B匹配。

with open('file_a.txt', 'r') as k:
    keywords = k.read().splitlines()

results = []

with open('file_b.txt') as f, open('output.txt', 'w') as o:
    for line in f:
        if any(key in line for key in keywords):
            o.writelines(line)

但是我没有得到任何输出。当然,即使这可行,也无法解决重复提取的问题。

1 个答案:

答案 0 :(得分:0)

以下几乎起作用,除了您的密钥似乎没有遵循稳定的模式。如果您可以解决此问题,其余的方法将起作用:

def do_sort(key_filename, data_filename, out_filename):
    with open(key_filename) as key_file:
        order = {line.partition(',')[0]: i for i, line in enumerate(key_file)}
    with open(data_filename) as data_file:
        data = sorted(data_file, key=lambda line: order[line.split()[1]])
    with open(out_filename, 'w') as out_file:
        for line in data:
            print(line.rstrip('\n'), file=out_file)

if __name__ == '__main__':
    do_sort('A.txt', 'B.txt', 'B-sorted.txt')