我正在用python编写一个程序,遇到了一些麻烦。我的程序应该做的是从文件中读取一行,解析它,并将该行的一部分写入字符串。然后,它应该在另一个文件中搜索该字符串,并在找到时打印该行。然后,它应该向下移动到第一个文件的下一行,并重复该过程,直到读取了第一个文件中的所有行。
我执行此操作的代码如下:
def readermain():
"""called if constant file exists"""
for line in portslist: #reads printer port list and parses name and port address
marker = line.split()
printername=marker[0]
address=marker[1]
for lines in constantfile:
if address in lines: #if the desired address is in the line
lineholder=lines.split()
print (lineholder)
oldonline=lineholder[4]
oldutc=lineholder[5]
status=lineholder[2]
address=lineholder[1]问题是,第一个for line in portslist似乎没有移动到下一行。它一遍又一遍地打印相同的行。portslist和constantfile以及使用constantfile=open("constantfile.dat").readlines()等声明的列表在程序中的其他位置。我是python新手,似乎不知道这里发生了什么。任何帮助或建议都非常受欢迎。
程序本身相当长,我试着总结一下问题所在,但我会在下面发布它。这是一个正在进行的工作,所以我知道还有其他错误的地方,是的,它不是可读性的最好例子,sry。不过,建议还是很棒的。
"""Program to pull down list of printers and ping each to see if it is online.
Will track printers over time, if printer has been offline for over a year it will be listed in a delete file.
This program is designed to run on windows and requires python to be installed. """
import win32com.client, os, time, datetime
from datetime import datetime
computername="(name goes here)"
currentdate=datetime.now()
currentdateutc= (time.mktime(currentdate.timetuple()))
def getPorts(computername):
"""Gets printer name and port name"""
portslist= open("printerports.txt","w")
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(computername,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_Printer")
for objItem in colItems:
list= objItem.Name + " " + objItem.PortName+"\n"
portslist.write(list)
portslist.close()
def pingone(address):
"""Pings address and returns 0 if it is online"""
pingreturn=os.system("ping -n 1 " + address)
return (pingreturn)
def pingfive(address):
"""Pings as address five times"""
pingreturn=os.system("ping -n 5 " + address)
return (pingreturn)
def online(printername, address, currentdate):
return str((printername +" at port "+ address+" is online on "+ str(currentdate)+"\n"))
def offline(printername, address, currentdate):
return str((printername +" at port "+address+" is offline on "+ str(currentdate)+"\n"))
def constantonline(printername, address, currentdate, currentdateutc):
return str((printername+" "+address+" "+str(0)+" "+str(currentdate)+" "+str(currentdate)+" "+str(currentdateutc)+"\n"))
def constantoffline(printername, address, currentdate, oldonline, oldutc):
return str((printername+" "+address+" "+str(1)+" "+str(currentdate)+" "+str(oldonline)+" "+str(oldutc)+"\n"))
def removal(printername, address, oldonline):
return str((printername+" with queue "+address+" has been offline since "+str(oldonline)+"\n"))
def constantfilecheck():
"""Checks for constant file"""
if os.path.isfile("constantfile.dat")==True: #checks if a constant file exists. if not one is made
return True
else:
return False
def readermain(portslist, constantfile, counter, oncounter, offcounter):
"""called if constant file exists"""
for line in portslist: #reads printer port list and parses name and port address
print(line)
marker = line.split()
printername=marker[0]
address=marker[1]
for lines in constantfile:
print(lines)
if address in lines: #if the desired address is in the line
lineholder=lines.split()
print (lineholder)
oldonline=lineholder[4]
oldutc=lineholder[5]
status=lineholder[2]
address=lineholder[1]
#--------------------------------------------------------------------------------------------------------------------------------------------
print ("Address found in constant file")
if pingone(address)==0:
newconstantfile.write(constantonline(printername, address, currentdate, currentdateutc))
onlinefile.write(online(printername, address, currentdate))
oncounter += 1
counter += 1
else:
if pingfive(address)==0:
newconstantfile.write(constantonline(printername, address, currentdate, currentdateutc))
onlinefile.write(online(printername, address, currentdate))
oncounter += 1
counter += 1
else:
newconstantfile.write(constantoffline(printername, address, currentdate, oldonline, oldutc))
offlinefile.write(offline(printername, address, currentdate))
offcounter += 1
counter += 1
if status == 0 and (currentdateutc-oldutc)>=31556926:
#-----------------------------------------------------------------------------------------------------------------------------------
print("printer older than year")
deletefile=open("removefile.txt", "a")
deletefile.write(removal(printername, address, oldonline))
deletefile.close()
else:
#not in constant file
#------------------------------------------------------------------------------------------------------------------------------------------------
print("not in constant file")
if pingone(address)==0:
newconstantfile.write(constantonline(printername, address, currentdate, currentdateutc))
onlinefile.write(online(printername, address, currentdate))
oncounter += 1
counter += 1
else:
if pingfive(address)==0:
newconstantfile.write(constantonline(printername, address, currentdate, currentdateutc))
onlinefile.write(online(printername, address, currrentdate))
oncounter += 1
counter += 1
else:
newconstantfile.write(printername+" "+address+" "+str(1)+" "+str(currentdate)+" "+str(oldonline)+" "+str(currentdateutc)+"\n")
offlinefile.write(offline(printername, address, currentdate))
offcounter += 1
counter += 1
def readersecondary(oncounter, offcounter, counter):
"""called if no constant file exists already"""
for line in portslist: #reads printer port list and parses name and port address
marker = line.split()
printername=marker[0]
address=marker[1]
if pingone(address)==0:
newconstantfile.write(constantonline(printername, address, currentdate, currentdateutc))
onlinefile.write(online(printername, address, currentdate))
oncounter += 1
counter += 1
else:
if pingfive(address)==0:
newconstantfile.write(constantonline(printername, address, currentdate, currentdateutc))
onlinefile.write(online(printername, address, currrentdate))
oncounter += 1
counter += 1
else:
newconstantfile.write(printername+" "+address+" "+str(1)+" "+str(currentdate)+" "+str(currentdate)+" "+str(currentdateutc)+"\n")
offlinefile.write(offline(printername, address, currentdate))
offcounter += 1
counter += 1
return counter, oncounter, offcounter
def rename():
"""Deleates old constant file and renames newconstantfile to constantfile"""
if constantfilecheck() is True:
os.system("del constantfile.dat")
os.system("ren newconstantfile.dat constantfile.dat")
os.system("del printerports.txt")
#_______________________________________________________________________________________________________________
#END OF FUNCTIONS
#_______________________________________________________________________________________________________________
oncounter=0
offcounter=0
counter=0
print ("Getting ports from server\n")
getPorts(computername)
portslist=open("printerports.txt", "r").readlines()
newconstantfile=open("newconstantfile.dat", "w")
onlinefile=open("onlinefile.txt", "w")
offlinefile=open("offlinefile.txt", "w")
print ("checking for constant file")
if constantfilecheck() == True:
constantfile=open("constantfile.dat").readlines()
print("calling reader main")
readermain(portslist, constantfile, counter, oncounter, offcounter)
constantfile.close()
elif constantfilecheck() == False:
print("calling reader secondary")
readersecondary(oncounter, offcounter, counter)
offlinefile.write("\nTotal Printers Scanned: "+str(counter))
offlinefile.write("\nPrinters online: "+str(oncounter))
offlinefile.write("\nPrinters offline: "+str(offcounter))
onlinefile.write("\nTotal Printers Scanned: "+str(counter))
onlinefile.write("\nPrinters online: "+str(oncounter))
onlinefile.write("\nPrinters offline: "+str(offcounter))
portslist.close()
newconstantfile.close()
onlinefile.close()
offlinefile.close()
rename() #calls rename function我知道我不应该使用os.system,但这应该是一个快速和肮脏的工作小项目。该程序的目的是在很长一段时间(几年)内跟踪大量(数千台)打印机的在线状态。它通过print从打印服务器拉出的打印机列表,并在常量文件中记录日期、在线状态和端口名称来实现这一点。
下面是portslist文件中的一行:artp002 10.40.80.18格式的"name port“
下面是一个常量文件的例子:`artp002 10.40.80.18 0 2012-08-30 13:32:34.787000 2012-08-30 13:32:34.787000 1346347954.0‘,格式为"name port date_last_checked last_online_date time_in_utc
下面是程序运行时的输出:
Getting ports from server
checking for constant file
calling reader main
artp002 10.40.80.18
artp002 10.40.80.18 0 2012-08-30 13:32:34.787000 2012-08-30 13:32:34.787000 1346347954.0
['artp002', '10.40.80.18', '0', '2012-08-30', '13:32:34.787000', '2012-08-30', '13:32:34.787000', '1346347954.0']
Address found in constant file
Pinging 10.40.80.18 with 32 bytes of data:
Reply from 10.40.80.18: bytes=32 time=6ms TTL=61
Ping statistics for 10.40.80.18:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 6ms, Maximum = 6ms, Average = 6ms
artp002 10.40.80.18 0 2012-08-30 13:32:34.787000 2012-08-30 13:32:34.787000 1346347954.0
['artp002', '10.40.80.18', '0', '2012-08-30', '13:32:34.787000', '2012-08-30', '13:32:34.787000', '1346347954.0']
Address found in constant file
Pinging 10.40.80.18 with 32 bytes of data:
Reply from 10.40.80.18: bytes=32 time=6ms TTL=61
Ping statistics for 10.40.80.18:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 6ms, Maximum = 6ms, Average = 6ms
artp002 10.40.80.18 0 2012-08-30 13:32:34.787000 2012-08-30 13:32:34.787000 1346347954.0
['artp002', '10.40.80.18', '0', '2012-08-30', '13:32:34.787000', '2012-08-30', '13:32:34.787000', '1346347954.0']
Address found in constant file
Pinging 10.40.80.18 with 32 bytes of data:
Reply from 10.40.80.18: bytes=32 time=6ms TTL=61以下是for line in portslist:之后的print (line)的一些输出
Getting ports from server
checking for constant file
calling reader main
artp002 10.40.80.18
artp002 10.40.80.18 0 2012-08-30 13:32:34.787000 2012-08-30 13:32:34.787000 1346347954.0
['artp002', '10.40.80.18', '0', '2012-08-30', '13:32:34.787000', '2012-08-30', '13:32:34.787000', '1346347954.0']
Address found in constant file
Pinging 10.40.80.18 with 32 bytes of data:
Reply from 10.40.80.18: bytes=32 time=8ms TTL=61
Ping statistics for 10.40.80.18:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 8ms, Maximum = 8ms, Average = 8ms
artp011 artp011.printers.xxxxxx.edu 0 2012-08-30 13:32:34.787000 2012-08-30 13:32:34.787000 1346347954.0
not in constant file
Pinging 10.40.80.18 with 32 bytes of data:
Reply from 10.40.80.18: bytes=32 time=8ms TTL=61发布于 2012-09-01 01:04:52
读取文件的所有行时,必须使用file_object.seek(0)将光标倒回到开始位置。否则,进一步尝试读取行将返回None。我更正了下面的代码,请看最后一行:
def readermain():
"""called if constant file exists"""
for line in portslist: #reads printer port list and parses name and port address
marker = line.split()
printername=marker[0]
address=marker[1]
for lines in constantfile:
if address in lines: #if the desired address is in the line
lineholder=lines.split()
print (lineholder)
oldonline=lineholder[4]
oldutc=lineholder[5]
status=lineholder[2]
address=lineholder[1]
constantfile.seek(0) # rewinds the file发布于 2012-09-01 01:22:09
让你的代码更容易阅读和测试,然后你会发现问题更容易解决。具体地说:
保存变量的
for port_info in portlines:for printer_details in consntantfile:
变量名中的单词不是用下划线分隔的:
printer_name,old_utc.
portlines和constantfile这样的全局变量,而是将它们作为参数传递给这个函数。然后,您将能够使用一小部分数据调用此函数,并通过使用两个文件的内容和程序的输出hand.https://stackoverflow.com/questions/12219651
复制相似问题