使用Python的简单嵌套循环

使用Python的简单嵌套循环,python,for-loop,python-3.x,Python,For Loop,Python 3.x,我有两个简单的文本文件,我试图逐行比较它们,看看文件1中的哪些行没有出现在文件2中。我尝试了几个不同的选项,从我在这个网站上看到的类似问题,但我仍然无法让它工作。欢迎提出任何建议。这是我的密码: listNames = raw_input("Which is list1?") list2Names = raw_input("Which is list2?") data1 = open(listNames) data2 = open(list2Names) data = [] source1 =

我有两个简单的文本文件,我试图逐行比较它们,看看文件1中的哪些行没有出现在文件2中。我尝试了几个不同的选项,从我在这个网站上看到的类似问题,但我仍然无法让它工作。欢迎提出任何建议。这是我的密码:

listNames = raw_input("Which is list1?")
list2Names = raw_input("Which is list2?")
data1 = open(listNames)
data2 = open(list2Names)
data = []

source1 = data1.readlines()
source2 = data2.readlines()


for line in source1:
    temp1 = line.rstrip()   
    inList = False
    for ln2 in source2:
        temp2 = ln2.rstrip()
        if temp1 == temp2:      
            inList == True  #edit2: oops
    if inList == False:
        data.append(temp1)

for x in data:
    print x
从测试代码来看,第二条If语句似乎根本没有被访问


编辑:更正了第二条if语句中的一行,因为输入错误而无法访问该语句:

inList == True
应该是

inList = True
编辑:

你也可以考虑这个问题而不是你的解决方案:

with open('file1.txt', 'r') as file1:
    with open('file2.txt', 'r') as file2:
        diff = set(line.rstrip() for line in file1).difference(line.rstrip() for line in file2)

diff变量将包含一个集合,其中包含file1中的所有行,但不包含file2中的所有行。如果使用Python
set()
类型保存每个列表中的数据元素,则可以使用
-
操作符获得集合差异(即,出现在第一个列表中而不是第二个列表中的元素):

data1 = set(l.rstrip() for l in open(raw_input("Which is list1?")))
data2 = set(l.rstrip() for l in open(raw_input("Which is list2?")))
for x in data1 - data2:
     print x
这里的前两行从第一个和第二个文件加载数据,方法是将文件句柄(调用
open(…)
)的返回值)视为迭代器,并将每个文件中的信息直接添加到set对象

如果需要使用for循环手动计算集合差异,则可以使用Python的
any
函数测试成员资格:

data1 = list(l.rstrip() for l in open(raw_input("Which is list1?")))
data2 = list(l.rstrip() for l in open(raw_input("Which is list2?")))
data = []
for x in data1:
    if not any(x == y for y in data2):
        data.append(x)
for x in data:
    print x
垃圾收集器最终会清理
open(…)
返回的文件句柄,但对于“真实”代码,最好在处理文件时使用
with
语句。例如,要根据上述代码构建源代码列表,请使用:

data1 = []
with open(raw_input("Which is list1?")) as handle:
    data1.extend(l.rstrip() for l in handle)
# ...

缩进块完成后,
with
语句将为您关闭文件句柄。

是的,我在发布此消息后立即注意到了这一点。不幸的是,我的代码仍然不能像预期的那样工作…不管怎样,我是个白痴。我明白你的意思了。只是一个简单的提示,你检查==真和==假是一个非常糟糕的主意。它违反了规则,也可能被Python误解。使用if-inList:代替if-inList==True。也一样。哇,谢谢,这比我想做的简单多了。只是一个简单的问题,我如何关闭文件?或者这是不必要的?检查“with”关键字并设置类型我将用
with
语句的示例更新答案。