根据列表中的项目从文件中打印行

时间:2019-02-26 22:08:33

标签: python

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

file1

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

file2

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

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

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循环(这可能也是不好的编码习惯?),以及我如何遍历list中的项目和file2中的行,因此该代码无法提供所需的输出。感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

由于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])

答案 1 :(得分: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]))

答案 2 :(得分:1)

如评论中所述。您可以为文件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