关于从sys.argv到file.txt的比较

时间:2017-10-06 10:56:30

标签: python python-2.7

我的代码存在问题: 一切都运作良好,但只有比较

for hosts in s:
    for line in fin:
        if hosts==line:
            print line

这不起作用,不会在cmd上输出任何内容。

import os.path
import sys
'''////if not enouth suffix in the code////'''
if len(sys.argv)<2:
    print "Please write %s <FileLocation>  <hostname1> <hostname2> " % sys.argv[0]
    sys.exit(1)

'''////check if the file is exist in the dir////'''
filelocation = sys.argv[1]
if os.path.exists(filelocation) == False:
    print "File dosnt exist please write after %s <exist file> " % sys.argv[0]
    sys.exit(1)

'''////compare from the sys.argv to the file////'''
with open(filelocation,"r") as fin:
    s = set(sys.argv[2:])
    for hosts in s:
        for line in fin:
            if hosts==line:
                print line

2 个答案:

答案 0 :(得分:0)

问题是ch := make(chan bool, 10) for i := 0; i < 10; i++ { go foo(i, ch) } flg := false for i := 0; i < 10; i++ { if <-ch { flg = true break } } 在文本文件的行尾包含换行符(line)。

使用\n删除这些内容。

str.strip()

答案 1 :(得分:0)

第一个问题:您必须从文件内容中删除空格和换行符。第二个问题:一旦第一个问题得到纠正,你就会发现内循环只是为第一个外循环执行,因为在第一个外循环之后你已到达文件的末尾,所以没有任何东西留给它

除非您的文件非常庞大,否则最好的解决方案是首先将其设置为集合,然后使用set操作来获取交集:

s1 = set(sys.argv[2:])
with open(filelocation) as fin:
    s2 = set(filter(None, (line.strip() for line in fin))) 
print "\n".join(s1 & s2)

如果你期望巨大的文件,那么你将不得不反转循环:

s = set(sys.argv[2:])
with open(filelocation) as fin:
    for line in fin:
        line = line.strip()
        if line in s:
            print line

这可以避免耗尽文件,并且也更有效,因为设置查找是O(1)(而不是使用当前算法的O(N))。