这两天比较闲,于是又捡起之前学了一点的python。也不知道用python做一个什么东西,但是如果不做个小工具,那python学了也是会很快就忘掉的。这时,突然想起来之前做的一个网站,里面有一些日志,拿python去处理这些日志岂不是很合适?

说动手就动手,下载了pycharm,开始干!新建一个工程,因为之前写java比较多,python的字典用着不是很顺手,那就先写一个map吧。

# coding:utf-8
__author__ = 'Gavin'
class HashMap(object):
    def __init__(self):
        self.dic = {}

    def size(self):
        return len(self.dic)

    def put(self, key, value):
        if self.dic.has_key(key):
            oldValue = self.dic[key]
            self.dic[key] = value
            return oldValue
        self.dic[key] = value
        return None

    def get(self, key):
        if self.dic.has_key(key):
            return self.dic[key]
        return None

    def containsKey(self, key):
        if self.dic.has_key(key):
            return True
        return False

    def containsValue(self, value):
        for k, v in self.dic.items():
            if v == value:
                return True
        return False

    def keySets(self):
        return self.dic.iterkeys()

    def valueSets(self):
        return self.dic.itervalues()
        
        

因为需要登录这个网站去down这些日志,那就需要写一个从ftp服务器dawn文件的工具。python自带了一个ftplib,其中就有FTP类,这个类用起来不太方便,于是乎再写一个包装类。

# coding:utf-8
__author__ = 'Gavin'
import os
from ftplib import FTP, error_perm
class FTPUtils(object):
    def __init__(self, host):
        self.ftp = FTP()
        self.ftp.connect(host, 21)
        print '***Connected to host "%s"' % host

    #登录    
    def login(self, user, password):
        try:
            self.ftp.login(user, password)
        except error_perm:
            print 'ERROR: cannot login as %' % user
            self.ftp.quit()
            return
        print '***Logged in as %s' % user

    #移动到某个目录下
    def cwd(self, where):
        try:
            self.ftp.cwd(where)
        except error_perm:
            print 'ERRORL cannot CD to "%s"' % where
            self.ftp.quit()
            return
        print '*** Changed to "%s" folder' % where

    #下载文件
    def get(self, local):
        try:
            self.ftp.retrbinary('RETR %s' % local, open(local, 'wb').write)
            print "start"
        except error_perm:
            print 'ERROR: cannot read file "%s"' % local
            os.unlink(local)
        else:
            print '*** Downloaded "%s" to CWD' % local
            self.ftp.quit()
        print "end"
        return

    #列出当前目录
    def dir(self):
        self.ftp.dir()

    #下载当前目录所有文件
    def down_all(self, path):
        list = self.ftp.nlst()
        for l in list:
            self.ftp.retrbinary('RETR %s' % l, open(path + "/" + l, 'wb').write)
        return

    #关闭ftp连接
    def close(self):
        self.ftp.close()
        
        
if __name__ == "__main__":
    port = 22
    host = "xxx.cn"
    user = "xxx"
    password = "xxx"
    test = FTPUtils(host)
    test.login(user, password)
    test.cwd("application/logs")
    os.mkdir("logs")
    test.down_all("logs/")
    test.close()
        

有了这两个顺手的工具,那接下来就简单了许多。我需要从ftp服务器的logs文件夹下down出这些文件,然后对这些文件的记录进行一个规整,看看都有哪些错误出现。

代码如下:

# coding:utf-8
__author__ = 'Gavin'
import os
from HashMap import HashMap
import shutil
from FTPUtils import FTPUtils

class ghc(object):
    def __init__(self):
        self.name = "ghc"

    def look(self):
        print self.name

    def dispose(self, host, user, password):
        #从ftp服务器下载文件
        if host != None:
            if os.path.exists("logs"):
                shutil.rmtree("logs")
            test = FTPUtils(host)
            test.login(user, password)
            test.cwd("application/logs")
            os.mkdir("logs")
            test.down_all("logs/")
            host = None
        #列出下载到的文件
        lists = os.listdir("logs")
        map = HashMap()
        for l in lists:
            #只需要以php结尾的log文件
            if l.endswith("html"):
                continue
            file = open("logs/" + l)
            line = file.readline()
            line = file.readline()
            while line != "":
                #得到log文件中某一行的错误信息
                if len(line.strip().split(" ")) != 1:
                    map.put(line.strip().split(" ", 5)[5], None)
                line = file.readline()
            file.close()

        for k in map.keySets():
            #打印错误信息
            print k
        shutil.rmtree("logs")

if __name__ == "__main__":
    port = 22
    host = "xxx.cn"
    user = "xxx"
    password = "xxx"
    g = ghc()
    g.dispose(host, user, password)
    

运行结果还算可以,但是如果想在别的机器上运行这个小工具,但是有没有python环境那可不太好。于是在网上搜到一个Pyinstaller的py2exe工具。下载过程还蛮艰辛,pywin32这个库好难下,一直卡着出不来。于是在网上搜到一个pywin32安装工具,顺手一安装,OK了。

upload successful

接下来就是打包了,命令是这样的

python {你的Pyinstaller文件夹位置}pyinstaller.py  --console --onefile ghc.py

--console是指转化为命令行式的exe文件,--onefile是指转化为一个文件,把其他需要的文件都加到这个文件中。

这样就OK了,可执行文件也能运行了。注意要在程序最底下加一句os.system("pause")。要不然程序跑完就关闭了,啥也看不到。

upload successful

总结一下,写这个小工具大概用了不到两百行代码,结构也比较清晰。在一些领域python果真用起来爽一些。正如人称:人生苦短,我用python。

标签: Python, ftp, ftplib

添加新评论