【问题标题】:print lines from file based on items in list根据列表中的项目从文件中打印行
【发布时间】:2019-02-26 22:08:33
【问题描述】:

我被一些python代码困住了,想知道是否有人能指出我正确的方向。我有两个结构如下的文本文件:

文件1

48.1.a  48.1
48.1.b  48.1
48.1.c  48.1
49.1.a  49.1
50.1.a  50.1
50.1.b  50.1
50.1.c  50.1

文件2

48.1   info1   info2   info3
49.1   info1   info2   info3
50.1   info1   info2   info3

请注意,我在 file1 第 2 列中有重复条目,这些条目与 file2 第 1 列中的唯一条目相对应。对于 file1 中的每一行,我想打印 file2 中与第二列中的值相对应的行文件 1,这样:

48.1   info1   info2   info3
48.1   info1   info2   info3
48.1   info1   info2   info3
49.1   info1   info2   info3
50.1   info1   info2   info3
50.1   info1   info2   info3

我尝试了以下代码,其中包括使用列表来保留 file1 中的重复值:

list=[]
with open("file1.txt") as file1:
    for i in file1:
        list.append(i.strip().split()[1])

with open("file2.txt") as file2:
    for j in list:
        for k in file2:
            item = k.strip().split()[0]
            if item==j:
                print(k.strip(), file=output)

这段代码没有给我想要的输出,我认为是因为我嵌套了 for 循环(这也可能是不好的编码习惯?)以及我如何迭代列表中的项目和 file2 中的行。感谢您的帮助!

【问题讨论】:

  • 将文件 2 转换为 dict,其中第一列作为键,其他列作为列表,例如使用 defaultdict(list)。然后,您可以遍历文件 1 并打印出第二列以及 dict 中与该第二列匹配的条目。

标签: python


【解决方案1】:

您可以输入使用文件 2 的第一列作为键和它们的行作为值。 然后应该很容易访问文件 1 中第二列的值。

下面的代码应该可以工作。

entry_dict = {}

with open('f2.txt') as f2:
    lines = f2.readlines()
    for line in lines:
        l = line.split()
        entry_dict[l[0]] = l[1:] 

with open('f1.txt') as f1:
    lines = f1.readlines()
    for line in lines:
        item = line.split()[1]
        print(' '.join([item] + entry_dict[item]))

【讨论】:

  • 感谢@nkaushik,非常感谢!我提升了这个响应,因为它在我的 python 编码级别对我来说最有意义。
【解决方案2】:

由于 file2 中的值是唯一的,我会将它们用作字典中的键,可用于检索您想要的信息。

dict_info = {}

with open('file2.txt') as f:
    for row in f.readlines():
        value, info = row.split()[0], ' '.join([row.split()[i] for i in range(1, 4)])
        dict_info[value] = info

with open('file1.txt') as f:
    for row in f.readlines():
        value = row.split()[1]
        print(value, dict_info[value])

【讨论】:

    【解决方案3】:

    如 cmets 中所述。您可以制作文件 2 中条目的字典。然后使用它们根据文件 1 中的第二列查找条目。

    def mkentry(line):
    
        first, rest = line.split(None, 1)
    
        return first, rest.split()
    
    
    with open("file2.txt") as file2:
    
        mapping = dict(mkentry(line) for line in file2)
    
    
    with open('file1.txt') as file1:
    
        for line in file1:
    
            col1, col2 = line.split()
    
            if col2 in mapping:
                print('%s %s' % (col2, ' '.join(mapping[col2])))
            else:
                print('%s no entries' % col2)
    

    结果:

    48.1 info1 info2 info3
    48.1 info1 info2 info3
    48.1 info1 info2 info3
    49.1 info1 info2 info3
    50.1 info1 info2 info3
    50.1 info1 info2 info3
    50.1 info1 info2 info3
    

    【讨论】:

    • 感谢@Paul Rooney,这让我得到了我想要的,并向我展示了一些新的 python 技巧
    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 2022-08-08
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2011-03-17
    相关资源
    最近更新 更多