我有两个文本文件,其中一个包含带有数字的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
但它不起作用。有人可以告诉我为什么吗?
答案 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]:
永远不会成为现实,因为您将整个id1
与id2
的第一个字符进行比较。此外,你一遍又一遍地做同样的比较,因为这些变量甚至没有连接到迭代。
在前两个循环中,你会不断覆盖完全相同的变量。
我认为您需要阅读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()
确保在使用后关闭文件。