比较两个文本文件并在python中提取文本

时间:2016-06-23 08:33:46

标签: python file

我有两个文本文件,其中一个包含带有数字的ID列表,另一个包含带有文本的ID列表。我想比较两个文件,并且具有相同id的行打印括号内的文本。这就是我所拥有的文件:

import fileinput
import sys

def clean(file1):
    with open(sys.argv[1], 'r') as file1: #file ppx
        for line in file1:
            words=line.split()
            id1=words[-1]
    with open(sys.argv[2], 'r') as file2: #file ids
        for line in file2:
            words2=line.split() 
            id2=words2[0]
    for line in file1:
        if id1==id2[0]:
            text=s[s.find("(")+1:s.find(")")]
    print text

第一个文件如下所示:http://pastebin.com/PCU6f7vz 第二个文件如下所示:http://pastebin.com/Y2F3gkQv

但它不起作用。有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:1)

def clean(file1):
    with open(sys.argv[1], "r") as file1:
        file1_lines = file1.readlines()
        id1 = [line.strip().split() for line in file1_lines]
    with open(sys.argv[2], "r") as file2:
        file2_lines = file2.readlines()
        id2 = [line.strip().split() for line in file2_lines]
        id2_dict = {i[-1]:i[:-1] for i in id2}
    #You can print id2_dict and id1.
    #print id2_idct,
    #print id1
    for index, line in enumerate(file1_lines):
        id1 = id1[index].strip("(").strip(")")
        if id1 in id2_dict:
            text = line[line.find("(")+1:line.find(")")]
            print text
    #or:
    #text_lines = [line[line.find("(")+1:line.find(")")] for index, line in enumerate(file1_lines) if id1 in id2_dict]
    #print text_lines

我不知道你对编程输出的看法,所以我只是觉得你想得到text_lines

答案 1 :(得分:0)

file1是一个迭代器,在读取文件中的所有行(在第一个for循环期间将发生这种行)之后耗尽。因此,以下循环

for line in file1:

永远不会运行。但即使它确实如此,条件

    if id1==id2[0]:

永远不会成为现实,因为您将整个id1id2的第一个字符进行比较。此外,你一遍又一遍地做同样的比较,因为这些变量甚至没有连接到迭代。

在前两个循环中,你会不断覆盖完全相同的变量。

我认为您需要阅读Python基础知识,尤其是Python tutorial中的循环章节......

答案 2 :(得分:0)

比较两个文件中的相同行(行号):

 file1 = open(sys.argv[1], "r")
 file2 = open(sys.argv[2], "r")
 for line1, line2 in file1,file2:
     if(line1.split()[-1] == line2.split()[0]):
          print line1 # use regex to extract the infromation needed

 file1.close()
 file2.close()

确保在使用后关闭文件。