首页 > 解决方案 > for 循环仅从文件中读取第一行

问题描述

我有两个文件,第一个文件是项目列表,每行列出一个项目。第二个文件是一个 tsv 文件,每行列出了许多项目。因此,第二个文件中的某些行包含可能在第一个文件中列出的项目。我需要从第二个文件中生成一个行列表,其中可能包含第一个文件中列出的项目。

grep -f 对我来说很挑剔,所以我决定制作自己的 python 脚本。这就是我想出的:-

大列表是第二个文件,小列表是第一个文件。

def main():
    desired_subset = []
    small_list = open('tiny_list.txt','r')
    big_list = open('big_list.tsv','r')
    for i in small_list.readlines():
        i = i.rstrip('\n')
        for big_line in big_list:
            if i in big_line:
                if i not in desired_subset:
                    desired_subset.append(big_line)
    print(desired_subset)
    print(len(desired_subset))

 
main()

 

问题是 for 循环只读取第一行。有什么建议么?

标签: python

解决方案


当您遍历文件时(此处 over big_list),您“使用它,因此在第二次迭代中small_list您没有任何东西留在. 尝试在主循环之前big_list读取list 变量并big_list使用它:.readlines()for

def main():
    desired_subset = []
    small_list = open('tiny_list.txt','r')
    big_list = open('big_list.tsv','r').readlines() # note here
    for i in small_list.readlines():
        i = i.rstrip('\n')
        for big_line in big_list:
            if i in big_line:
                if i not in desired_subset:
                    desired_subset.append(big_line)
    print(desired_subset)
    print(len(desired_subset))

此外,您不要关闭文件,这是一种不好的做法。我建议使用上下文管理器(用with语句打开文件):

def main():
    desired_subset = []
    with open('tiny_list.txt','r') as small_list,
         open('big_list.tsv','r') as big_list:

         small_file_lines = small_list.readlines()
         big_file_lines = big_list.readlines()

    for i in small_file_lines:
        i = i.rstrip('\n')
        for big_line in big_file_lines:
            if i in big_line:
                if i not in desired_subset:
                    desired_subset.append(big_line)

    print(desired_subset)
    print(len(desired_subset))

推荐阅读