您好我想使用startswith函数打印fileY.txt
中 NOT 与fileX.txt
在下面的脚本中,我使用fileX.txt
和fileY.txt
作为列表。然后,我使用startswith功能搜索fileX.txt
与fileY.txt
的部分匹配。
接下来,我尝试打印fileX.txt
和fileY.txt
之间 NOT 部分匹配的行。但是,脚本只打印fileY.txt
任何帮助建议都会受到赞赏(我不介意我是否必须使用像sed这样的帮助应用程序)
来源:
#load lines from file into lists
lines1 = [line1.rstrip('\n') for line1 in open('fileX.txt')]
lines2 = [line2.rstrip('\n') for line2 in open('fileY.txt')]
#set lines
set_of_lines1 = set(lines1)
set_of_lines2 = set(lines2)
#set common
common = set_of_lines1 & set_of_lines2
#return lines which partially match as variable e
[e for e in lines1 if e.startswith(tuple(lines2))]
#minus partially matched lines from fileY.txt
difference = set_of_lines2 - e
#print the non matching lines
for color in difference:
print 'The color prefix ' + color + ' does not exist in the list'
fileX.txt:
blue
green
red
fileY.txt:
blu
gre
re
whi
oran
我想要的是什么:
C:\Users\Foo\Bar\Python\Test\>C:\python27\python Test.py
The color prefix whi does not exist in the list
The color prefix oran does not exist in the list
Press any key to continue . . .
答案 0 :(得分:1)
第一个问题是这一行:
[e for e in lines1 if e.startswith(tuple(lines2))]
它构造了部分匹配列表,然后将其抛弃。你保留的只是e
的值已经从列表理解中泄露出来(在Python 3中会给你一个未定义的值错误)。你需要:
partial_match = [e for e in lines1 if e.startswith(tuple(lines2))]
它带来了第二个问题。如果您打印partial_match
,您会看到它包含['blue', 'green', 'red']
,我认为您希望它包含['blu', 'gre', 're']
,因为您正试图在它与{{之间设置一个区别1}}。
由于您的问题围绕列表理解,我建议您将其展开到一个循环中,您可以打印出中间值,这样您就可以看到正在发生的事情并获得正确的逻辑。如果你真的想要一个单行,你可以随时重写它。
像这样:
set(['blu', 're', 'gre', 'whi', 'oran'])
matches = []
for prefix in lines2:
for colour in lines1:
if colour.startswith(prefix):
matches.append(prefix)
现在将包含matches
。现在报告不匹配的前缀。
['blu', 'gre', 're']
这将为您提供输出:
for nomatch in set(lines2) - set(matches):
print "The color prefix %r does not exist in the list" % nomatch