对于双重帖子感到抱歉,如果我无法解决问题,我会更新此问题:)
我正在尝试比较两个文件。我将列出两个文件内容:
File 1 File 2
"d.complex.1" "d.complex.1"
1 4
5 5
48 47
65 21
d.complex.10 d.complex.10
46 6
21 46
109 121
192 192
TI正在尝试比较两个文件的内容,但不是以微不足道的方式。我将通过一个例子来解释我想要的东西。如果您观察到我上面输入的文件内容,则file_1的d.complex.1与file_2中的d.complex.1类似“5”; file_1中的d.complex.1与file_2中的d.complex.10没有任何相似之处。我想要做的就是打印出那些d.complex。与其他d.complex没什么相似之处。考虑一下d.complex。如果你想要作为标题。但我正在尝试的是比较每个d.complex下面的数字。如果没有匹配,我想要那个特定的d.complex。从两个文件打印。如果d.complex中都存在一个数字。这两个文件,我希望它被拒绝。
我的代码: 我选择实现这一目标的方法是使用集合然后做一些差异。我写的代码是:
first_complex=open( "file1.txt", "r" )
first_complex_lines=first_complex.readlines()
first_complex_lines=map( string.strip, first_complex_lines )
first_complex.close()
second_complex=open( "file2.txt", "r" )
second_complex_lines=second_complex.readlines()
second_complex_lines=map( string.strip, second_complex_lines )
second_complex.close()
list_1=[]
list_2=[]
res_1=[]
for line in first_complex_lines:
if line.startswith( "d.complex" ):
res_1.append( [] )
res_1[-1].append( line )
res_2=[]
for line in second_complex_lines:
if line.startswith( "d.complex" ):
res_2.append( [] )
res_2[-1].append( line )
h=len( res_1 )
k=len( res_2 )
for i in res_1:
for j in res_2:
print i[0]
print j[0]
target_set=set ( i )
target_set_1=set( j )
for s in target_set:
if s not in target_set_1:
if s[0] != "d":
print s
上面的代码给出了这样的输出(只是一个例子): d.complex.1.dssp d.complex.1.dssp 1 48 65
d.complex.1.dssp
d.complex.10.dssp
46
21
109
我想要的是:
d.complex.1
d.complex.1 (name from file2)
d.complex.1
d.complex.10 (name from file2)
我很抱歉让你们感到困惑,但这就是所需要的。
我是python的新手所以我上面的概念可能存在缺陷。此外,我之前从未使用套装:(。有人可以帮我一把吗?
答案 0 :(得分:2)
问题在于你使用的是十字路口而不是差异:)
如果您使用target_set.difference(target_set_1)
,您将获得所需的结果。
我不确定我是否完全得到你想要的东西,但这就是你要找的东西吗?
def complex_file_to_dict(filename):
out = dict()
for line in open(filename):
line = line.strip()
if line.startswith('d.complex'):
name = line
out[name] = set()
elif line:
out[name].add(line)
return out
res_1 = complex_file_to_dict('a.txt')
res_2 = complex_file_to_dict('b.txt')
for k, set_1 in res_1.iteritems():
print k
set_2 = res_2.get(k, set())
for v in set_1 - set_2:
print v
print
答案 1 :(得分:1)
您需要使用差异而不是交集,因为后者会为您提供两个集合中的项目。您还可以使用set1 - set2语法。 See the python docs for sets
我认为你是在这之后(感谢原始代码的Rick):
def complex_file_to_dict(filename):
out = dict()
for line in open(filename):
line = line.strip()
if line.startswith('d.complex'):
name = line
out[name] = set()
elif line:
out[name].add(line)
return out
res_1 = complex_file_to_dict('file1.txt')
res_2 = complex_file_to_dict('file2.txt')
for k1, set_1 in res_1.iteritems():
for k2, set_2 in res_2.iteritems():
print k1
print k2
for v in set_1 - set_2:
print v
print
编辑: 您可以将循环更改为:
for k1, set_1 in res_1.iteritems():
for k2, set_2 in res_2.iteritems():
print k1
print k2,
l = [v for v in set_1 - set_2]
print '(' + ', '.join(l) + ')'
得到这样的输出:
d.complex.1
d.complex.1 (1, 65, 48)
d.complex.1
d.complex.10 (1, 65, 48)
d.complex.10
d.complex.1 (46, 109, 192)
d.complex.10
d.complex.10 (109, 21)