最近做的项目需要读取更新中的.log file.
也就是说,.log file在不断增加内容,同时放置.log file的文件夹也在不断增加.log file的数量,当一个.log file内存满了之后,就会产生一个新的.log file.
所以我要做的两件事就是:1. 如何读取更新中的文件;2. 如何读取更新中的文件夹
1. 读取更新中的文件
加了一个start_point
它会记录上一次读取的位置,在下一次读取的时候就从上一次读取的位置开始读取。
fo = open("C:\WinUSR" + "\\" + f_name, "rb")
start_point = 0 #设置初始指针为0
fo.seek(start_point, 1)
for line in fo.readlines():
line = str(line.decode('ISO-8859-1'))
if fnmatch.fnmatch(line.lower(), "*error:*"):
if fnmatch.fnmatch(line.lower(), "*secondary error 59*") or fnmatch.fnmatch(line.lower(), "*secondary error 450*"):
try:
errname = line[line.index(" ", line.index("TID-")) + 1:].strip()
errtime =datetime.strptime(datetime.fromtimestamp(os.path.getmtime("C:\WinUSR" + "\\" + f_name)).strftime("%d-%b-%Y") + " " + line[:8], "%d-%b-%Y %H:%M:%S")
except:
continue
start_point = fo.tell() #记录当前读取的位置
fo.close()
2. 读取更新中的文件夹
python没有现成的功能可以实现,我采用的方法是当读取完一个.log file之后把读取完的这个file移动到另一个backup文件夹,然后重新扫描要读取的文件夹。
if os.path.exists("C:\WinUSR"):
os.chdir("C:\WinUSR")
while os.listdir("C:\WinUSR"): #由for循环改成了while循环,判断文件夹是否为空
files = sorted(filter(os.path.isfile, os.listdir(".")), key=os.path.getmtime, reverse=True)
for f_name in files:
if fnmatch.fnmatch(f_name.lower(), "*.log"):
fo = open("C:\WinUSR" + "\\" + f_name, "rb")
start_point = 0
fo.seek(start_point, 1)
abort_time = datetime(1900, 1, 1)
errtime = datetime(1900, 1, 1)
errname = "No Errors"
for line in fo.readlines():
line = str(line.decode('ISO-8859-1'))
if fnmatch.fnmatch(line.lower(), "*error:*"):
if fnmatch.fnmatch(line.lower(), "*secondary error 59*") or fnmatch.fnmatch(line.lower(), "*secondary error 450*"):
try:
errname = line[line.index(" ", line.index("TID-")) + 1:].strip()
errtime = datetime.strptime(
datetime.fromtimestamp(os.path.getmtime("C:\WinUSR" + "\\" + f_name)).strftime(
"%d-%b-%Y") + " " + line[:8], "%d-%b-%Y %H:%M:%S")
GUI()
except:
continue
start_point = fo.tell()
fo.close()
shutil.move("C:\WinUSR" + "\\" + f_name, "C:\wintrace_backup") #移动已经读取的文件到新的位置
return
这个方法需要建立新的文件夹保存已经读取的文件,不是很理想的方法。接下来会探索其他的方法,如果小伙伴有其他的方法欢迎和我分享谢谢!!