Python linux中的set方法
我很难解决这个问题,以至于我不知道该去哪里。我已经把范围缩小到set()方法。当我在windows机器上运行它时,它工作正常。但是,它需要在linux上运行。执行此操作时,compareset变量中不会存储任何内容 这是使用set()方法的代码。Python linux中的set方法,python,linux,python-2.7,Python,Linux,Python 2.7,我很难解决这个问题,以至于我不知道该去哪里。我已经把范围缩小到set()方法。当我在windows机器上运行它时,它工作正常。但是,它需要在linux上运行。执行此操作时,compareset变量中不会存储任何内容 这是使用set()方法的代码。 def three_way_compare(startup, running, archive): isdiff = True print "Running Three-Way Comparison." if cmp(sta
def three_way_compare(startup, running, archive):
isdiff = True
print "Running Three-Way Comparison."
if cmp(startup, archive) and cmp(running, archive) != 0:
print "Archive File(s) Missing:"
compareset = sorted(set(startup)^set(archive))
elif cmp(startup, archive) != 0:
print "Startup File(s) Missing:"
compareset = sorted(set(startup)^set(archive))
elif cmp(running, archive) != 0:
print "Running File(s) Missing:"
compareset = sorted(set(running)^set(archive))
elif cmp(running, startup) != 0:
print "Running and Startup do not match"
compareset = sorted(set(running)^set(startup))
else:
print "All Files Exist"
isdiff = False
if isdiff == True:
from sendmail import send_mail
#write_diff_file(compareset)
print compareset
def parse_files(directory):
results = []
i = 0
l = len(os.listdir(directory))
#os.chdir(directory)
try:
for filename in os.listdir(directory):
if filename.endswith(('.cfg', '.startup', '.confg')):
file_name = os.path.join(directory, filename)
with open(file_name, "r") as in_file:
for line in in_file:
match = re.search('^hostname\s(\S+)$', line)
if match:
results.append(match.group(1))
#print "Match Found"
sleep(0.001)
i += 1
progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
return results
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
print "Error in parse_files function"
def parse_files(directory):
results = []
i = 0
l = len(os.listdir(directory))
#os.chdir(directory)
try:
for filename in os.listdir(directory):
if filename.endswith(('.cfg', '.startup', '.confg')):
file_name = os.path.join(directory, filename)
with open(file_name, "r") as in_file:
for line in in_file:
match = re.search('^hostname\s(\S+)$', line)
if match:
results.append(match.group(1))
#print "Match Found"
sleep(0.001)
i += 1
progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
return results
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
print "Error in parse_files function"
在windows机器上,compareset变量存储所有不同的元素,并显示,但在linux上不显示,只显示以下内容。在windows上,[]中填充了所有不同的元素
运行三方比较。缺少启动文件:[]比较
完成了
我还是一个编程新手,所以任何帮助都将不胜感激
这是解析方法。
def three_way_compare(startup, running, archive):
isdiff = True
print "Running Three-Way Comparison."
if cmp(startup, archive) and cmp(running, archive) != 0:
print "Archive File(s) Missing:"
compareset = sorted(set(startup)^set(archive))
elif cmp(startup, archive) != 0:
print "Startup File(s) Missing:"
compareset = sorted(set(startup)^set(archive))
elif cmp(running, archive) != 0:
print "Running File(s) Missing:"
compareset = sorted(set(running)^set(archive))
elif cmp(running, startup) != 0:
print "Running and Startup do not match"
compareset = sorted(set(running)^set(startup))
else:
print "All Files Exist"
isdiff = False
if isdiff == True:
from sendmail import send_mail
#write_diff_file(compareset)
print compareset
def parse_files(directory):
results = []
i = 0
l = len(os.listdir(directory))
#os.chdir(directory)
try:
for filename in os.listdir(directory):
if filename.endswith(('.cfg', '.startup', '.confg')):
file_name = os.path.join(directory, filename)
with open(file_name, "r") as in_file:
for line in in_file:
match = re.search('^hostname\s(\S+)$', line)
if match:
results.append(match.group(1))
#print "Match Found"
sleep(0.001)
i += 1
progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
return results
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
print "Error in parse_files function"
def parse_files(directory):
results = []
i = 0
l = len(os.listdir(directory))
#os.chdir(directory)
try:
for filename in os.listdir(directory):
if filename.endswith(('.cfg', '.startup', '.confg')):
file_name = os.path.join(directory, filename)
with open(file_name, "r") as in_file:
for line in in_file:
match = re.search('^hostname\s(\S+)$', line)
if match:
results.append(match.group(1))
#print "Match Found"
sleep(0.001)
i += 1
progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
return results
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
print "Error in parse_files function"
问题不在于
三方比较方法,尽管它可以写得更好。此方法在windows和linux上的工作方式完全相同
我认为问题在于,您将不同的集合/列表传递给启动
、运行
和存档
变量,具体取决于系统。您可以通过在三向比较方法的第一行中打印这3个变量来检查:
print '%s, %s, %s' %(startup, running, archive)
请查看您收集这3个列表数据的方式。我想您正在使用一些特定于windows的系统操作来收集启动
、运行
和存档
列表中的所有项目。我通过更多故障排除发现的问题实际上是正则表达式。我删除了^和$,并在通过regex101运行后工作
这是我的解析方法。
def three_way_compare(startup, running, archive):
isdiff = True
print "Running Three-Way Comparison."
if cmp(startup, archive) and cmp(running, archive) != 0:
print "Archive File(s) Missing:"
compareset = sorted(set(startup)^set(archive))
elif cmp(startup, archive) != 0:
print "Startup File(s) Missing:"
compareset = sorted(set(startup)^set(archive))
elif cmp(running, archive) != 0:
print "Running File(s) Missing:"
compareset = sorted(set(running)^set(archive))
elif cmp(running, startup) != 0:
print "Running and Startup do not match"
compareset = sorted(set(running)^set(startup))
else:
print "All Files Exist"
isdiff = False
if isdiff == True:
from sendmail import send_mail
#write_diff_file(compareset)
print compareset
def parse_files(directory):
results = []
i = 0
l = len(os.listdir(directory))
#os.chdir(directory)
try:
for filename in os.listdir(directory):
if filename.endswith(('.cfg', '.startup', '.confg')):
file_name = os.path.join(directory, filename)
with open(file_name, "r") as in_file:
for line in in_file:
match = re.search('^hostname\s(\S+)$', line)
if match:
results.append(match.group(1))
#print "Match Found"
sleep(0.001)
i += 1
progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
return results
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
print "Error in parse_files function"
def parse_files(directory):
results = []
i = 0
l = len(os.listdir(directory))
#os.chdir(directory)
try:
for filename in os.listdir(directory):
if filename.endswith(('.cfg', '.startup', '.confg')):
file_name = os.path.join(directory, filename)
with open(file_name, "r") as in_file:
for line in in_file:
match = re.search('^hostname\s(\S+)$', line)
if match:
results.append(match.group(1))
#print "Match Found"
sleep(0.001)
i += 1
progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
return results
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
print "Error in parse_files function"
更改
match = re.search('hostname\s(\S+)', line)
这是怎么回事0
?没有必要这样做,非零值已经是真的了。我的想法是,如果它们不同,cmp()将返回1或-1,如果它们相同,则返回0。我在那里说,如果cmp不相同,则返回true。但也许java中的这种想法?我还是个新手。我不知道如何更正它。请发布完整的错误,包括堆栈跟踪,告诉发生错误的行。另外,你能告诉我们这个函数的目标是什么吗。在linux上比较空列表。您应该在创建这三个列表的地方搜索错误,而不是用three-way\u compare
方法。@NineTail,…如果您试图使代码成为一个MCVE,包括有人在问题本身中重现和测试问题所需的尽可能小的完整信息和代码集,包括示例数据,您会发现问题实际上不是特定于平台的,或者根本不涉及set
。将来,在提问时,请尽量遵循处的指导原则。因此,我使用的是解析方法。我相信这是正确的。我认为问题在于正则表达式。我添加了几个打印语句,它正在打开文件,但似乎没有找到任何匹配项。这很奇怪,因为我在windows上使用的文件与在linux上使用的文件相同。