在Python中打印两个.txt文件之间的匹配行

在Python中打印两个.txt文件之间的匹配行,python,python-2.7,Python,Python 2.7,我有以下代码: def readline(): with open("textfile1") as f: while True: content = f.readline().strip() if content in open('textfile2').read(): ##Print the matching line of textfile2 if not cont

我有以下代码:

def readline():
    with open("textfile1") as f:
        while True:
            content = f.readline().strip()
            if content in open('textfile2').read():
                ##Print the matching line of textfile2
            if not content: break

def main():
  readline()

if __name__ == '__main__':
  main()
我有两个文本文件textfile1和textfile2我想读取textfile1的每一行,如果它存在于textfile2的文本中,我想打印出相应的编码行。我可以为textfile1做,但是对于textfile2我不能。我如何填写已注释的空间或任何其他解决方案

这些文件没有顺序,长度也不相同

Textfile1中的示例:

'landroid
lang
ljava
v'
landroid
'
'ljava
view
i
string
util
content
widget
init
z'
Textfile2中的示例:

lang             |            41748
'landroid        |            40157
ljava            |            37227
v'               |            32920
'ljava           |            27315
string           |            23233
'                |            22624
landroid         |            22156
i                |            19970
content          |            13311
view             |            12144
util             |            11546
init             |            11121
widget           |            10604
graphics         |             8581

以下内容适用于您的两个示例文件:

def readline():
    with open("textfile1") as f1, open("textfile2") as f2:
        d1_lines = {}
        for line in f1:
            d1_lines[line.strip()] = 0

        for line in f2:
            first = line.split("|")[0].strip()
            if first in d1_lines:
                print line.strip()

readline()
这将为您提供以下结果:

lang             |            41748
'landroid        |            40157
ljava            |            37227
v'               |            32920
'ljava           |            27315
string           |            23233
'                |            22624
landroid         |            22156
i                |            19970
content          |            13311
view             |            12144
util             |            11546
init             |            11121
widget           |            10604

使用Python2.7进行测试问题在于,您逐行迭代第一个文件,但将第二个文件全部读入单个字符串,因此很难获得您感兴趣的特定行。我假设第一个文件中的每一行都是第二个文件中的一行的潜在子集,第一个文件中的简短搜索查询在第二个文件中具有真实内容,因为如果它们完全匹配,您可以只打印第一个文件中的行,而不会出现此问题

以下内容使用with..as上下文管理器打开两个文件,确保在with块结束后关闭这两个文件。接下来,它遍历第一个文件查询中的每一行,去掉空白,并将其添加到列表中。完成后,它将遍历第二个文件内容的每一行,并遍历查询中的每一项。如果在当前行中找到项目,它将打印该行并转到下一行,而不是在该行中查找更多查询匹配项。我还删除了不必要的readline函数定义,将代码放入main


使用集合,存储文件1中的所有单字,检查文件2中每行的第一个字是否在集合中:

with open("file1") as f, open("file2") as f2:
    st = set(map(str.rstrip,f))
    for line in f2:
        spl = line.split(None, 1)[0]
        if spl in st:
            print(line.rstrip())
输出:

lang             |            41748
'landroid        |            40157
ljava            |            37227
v'               |            32920
'ljava           |            27315
string           |            23233
'                |            22624
landroid         |            22156
i                |            19970
content          |            13311
view             |            12144
util             |            11546
init             |            11121
widget           |            10604

显然,spl将是file1中的单词,因此如果您需要匹配的单词,可以使用它。

为什么不能?发生了什么事阻止了您这样做?您的文件是否有序?也许您可以编辑您的问题,将两个文件中的示例输入和您试图实现的示例输出包括在内。您从textfile1中读取一行,检查它是否在textfile2中,然后检查您是否已到达textfile1的末尾?非常感谢您的回答无需担心,检查每一行中是否有一个单词在集合中要比对照文件中的每一行检查每个单词快得多。2谢谢你的回答和解释
lang             |            41748
'landroid        |            40157
ljava            |            37227
v'               |            32920
'ljava           |            27315
string           |            23233
'                |            22624
landroid         |            22156
i                |            19970
content          |            13311
view             |            12144
util             |            11546
init             |            11121
widget           |            10604