如何在python中从单独的文本文件中打印不匹配的单词

时间:2015-07-29 07:27:57

标签: python python-2.7

对于我的项目,我想学习如何从两个单独的文本文件中打印不匹配的单词,并将不匹配的术语打印到另一个第三个文本文件中。目前,我有两个单独的文本文件,像这样。

---------- ------ File1中

    What is 2+2?  A = 1, B* = 4, C = 10, D = 12, E = 14
    What is a 7+7?  A = 144, B* = 14, C* = 32, D = 95, E = 16
    What is 1x1?  A* = 1, B = 7, C = 21, D = 420, E = 1762
    What is 10/2?  A = 4, B = 10, C = 2, D* = 5, E = 210
    What is 4^2?  A = 10, B = 20, C = 1, D* = 16, E = 980
    What is 5+1?  A = 4, B = 1, C = 0, D = 2, E* = 6
    What is 5x0?  A = 8, B = 10, C* = 0, D = 2, E = 20
    What is 9+10?  A* = 19, B = 7, C = 8, D = 221, E = 21
    What is 2+1?  A = 2, B* = 3, C = 9, D = 12, E = 32
    What is 6+6+6?  A = 19, B = 27, C* = 18, D = 12, E = 234

----------文件2 -------

    A*
    B*
    C*
    D* 
    E*
    A*
    D*
    E*
    B*
    E*

这两个文件都有单独的行打印字符。我想知道如何匹配这两个文件,并在不同的行上打印非匹配的单词。例如,在第1行,单词A *在任一文本文件中都不匹配,因此它将打印到单独的第三个文本文件中。

我的尝试

f1 = open("QuestionsMaths.txt", "r")
f2 = open("AnswersMaths.txt", "r")
f3 = open("Feedback.txt", "a")
list1 = f1.readlines()
list2 = f2.readlines()
f3.write("The incorrect answers are: \n")
for i in list1:
    for j in list2:
        if i==j:
            f3.write(i)

然而,所有这些代码都是打印句子不正确的答案是:

非常新的Python,所以任何有关代码的指导细节都将非常受欢迎。希望我清楚。感谢。

2 个答案:

答案 0 :(得分:0)

您的程序应如下所示:

with open("QuestionsMaths.txt", "r") as f1:
    list1 = f1.readlines()
with open("AnswersMaths.txt", "r") as f2:
    list2 = f2.readlines()

with open("Feedback.txt", "a") as f3:
    f3.write("The incorrect answers are: \n")

    for questionLine, answerLine in zip(list1, list2):
        if answerLine.strip() not in questionLine:
            f3.write(answerLine)

解释
with open(filename, ...) as f是使用文件的正确方法。如果你这样做,当有异常或缩进块完成时它将自动关闭。请注意,f仅在此块中可用。 See last paragraph here

answerLine.strip()将删除行尾和其他空格。我们需要这样做,因为在questionLine中,正确的答案永远不会被行结束,但在answerLine它肯定会。 str.strip

zip(list1, list2)会为您提供一对行,以便您将list1的第一行与list2的第一行匹配,依此类推。通过实施,您实际上将list1中的所有行与list2中的所有行匹配。 zip

if answerLine not in questionLine会检查answerLine中未发生questionLine的情况。如果您使用answerLine == questionLine,您将检查字符串是否为SAME。 See Note here

最后一点点评论。如果你在第三个文件中输入的所有内容都是错误的答案,那么你就无法将它们与他们来自的实际问题相匹配 因此,我建议再次改进for循环:

for question, (questionLine, answerLine) in enumerate(zip(list1, list2), 1):
    if answerLine.strip() not in questionLine:
        # answerLine still ends with lineend, so no lineend in
        # the format string.
        f3.write('Q{}: {}'.format(question, answerLine))

enumerate(iterable, start=0)将返回一个包含索引的元组以及列表的相应元素(在本例中也是一个元组)。是的,python可以解决这样的嵌套元组。 enumerate

" Feedback.txt"使用改进的for循环和您的示例作为输入:

The incorrect answers are:
Q1: A*
Q3: C*
Q5: E*
Q6: A*
Q7: D*
Q8: E*
Q10: E*

答案 1 :(得分:0)

如果您有两个长度相同的列表,则可以枚举一个列表并将其与另一个列表进行比较。使用map和枚举它是一个oneliner。之后,您将获得包含所有结果的列表:

list3 = map(lambda (i,x): x if x in list1[i] else '', enumerate(list2))
print '\n'.join(list3)

只需将其保存到第三个文件中即可。

我建议首先剥离两个列表中的项目以避免匹配问题:

list1 = map(lambda r: r.strip(), list1)
list2 = map(lambda r: r.strip(), list2)