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

时间:2015-08-11 18:50:17

标签: 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 content: break

def main():
  readline()

if __name__ == '__main__':
  main()

我有两个文本文件(textfile1和textfile2)我想读取textfile1的每一行,如果它存在于textfile2的文本中,我想打印出correspoding行。我可以为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

3 个答案:

答案 0 :(得分:0)

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

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

使用Python 2.7进行测试

答案 1 :(得分:0)

问题是你要逐行遍历第一个文件,但是你正在将第二个文件全部读入一个字符串,这样就很难得到你感兴趣的特定行。我假设第一个文件中的每一行都是第二个文件中一行的潜在子集(第一个文件中的短搜索查询,第二个文件中包含真实内容),因为如果它们完全匹配,您只需打印第一个文件中的行你不会有这个问题。

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

def main():
    with open("textfile1", 'r') as queries, open("textfile2", 'r') as content:
        queries = [line.strip() for line in queries]
        for line in content:
            for query in queries:
                if query in line: print(line)
                continue

if __name__ == '__main__':
  main()

答案 2 :(得分:0)

使用一个集合,存储来自file1的所有单个单词,检查file2中每行的第一个单词是否在集合中:

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的单词,因此如果你想要匹配的单词,你可以使用它。