python 从文件导入分类

# -*- coding:utf-8 -*-
"""
从文件导入分类 根据行首制表符或空格确定层级关系(4个空格等于一个制表符 同一行制表符和空格不能混用 )
必须是 utf-8编码

-------test.txt-------
鞋子
    运动鞋
    凉鞋
        拖鞋
    靴子
体育
    羽毛球
        单打
        双打
    游泳
----------------------
"""


import redis
import MySQLdb
import json


class Category(object):
    
    cache = redis.StrictRedis(host='localhost',port = 6379,db=0)
    conn = MySQLdb.Connect(host='192.168.1.222', user='root', passwd='123456', db='gmian',charset='utf8')
    
    """
    打开文件 读取每一行进行处理
    """
    def run(self,category_file):
        f = open(category_file,'r')
        while True:
            #print isinstance(line, unicode)  # 检测是否为unicode
            #print unicode(line,"utf-8")
            line = f.readline()
            if line:
                self.writeCate(line)
            else:
                break
        f.close()
    
    #删除缓存
    def __del__(self):
        keys = self.__class__.cache.smembers('category_keys')
        for key in keys:
            self.__class__.cache.delete(key)
        self.__class__.cache.delete('category_cateid')
        self.__class__.cache.delete('category_keys')
    
    #获取自动增长的ID
    @classmethod
    def getincr(cls):
        return int(cls.cache.incr('category_cateid')) + DB_AUTO_INSERT
            
    # 把分类添加进按层级分别的列表中
    @classmethod
    def add(cls,num,catename):
        id = cls.getincr()
        cls.insert_db(id,num,catename)
        cls.cache.sadd('category_keys','category_level_'+str(num))
        cls.cache.lpush('category_level_'+str(num),json.dumps([id,catename]))
        
    #获取父类
    @classmethod
    def getparentid(cls,num):
        parent = cls.cache.lindex('category_level_'+str(num-1),0)
        if not parent:
            raise NameError('STOP !! 没找到父类')
        parent = json.loads(parent)
        return parent[0]
    
    @classmethod
    def writeCate(cls,line):
        num,catename = cls.getLevelNum(line)
        cls.add(num,catename)
        
    @classmethod
    def insert_db(cls,id,num,catename):
        if num:
            pid = cls.getparentid(num)
        else:
            pid = 0
        cursor = cls.conn.cursor()
        cursor.execute("insert into gm_category (cat_id,cat_name,parent_id,style,is_top_style,is_top_show,cat_ico)value(%s,%s,%s,%s,%s,%s,%s)" , (id,catename,pid,'',0,0,''))   
        cls.conn.commit()

    # 要么全部是 	  要么全部是空格 空格4个为一个单位
    @staticmethod
    def getLevelNum(str):
        i = 0
        while str[i] == '	':
            i+=1
        if i:
            return i,str[i:]
        while str[i] == ' ':
            i+=1
        if not i:
            return 0,str
        return i/4,str[i:]
    
        
        
    
    
if __name__ == '__main__':
    # >$ python category.py 153(DB_AUTO_INSERT) cate1.txt cate2.txt ... 

    import sys
    try:
        DB_AUTO_INSERT = int(sys.argv[1]) # 已存在的最大ID  否则ID重复 插入失败
        files = sys.argv[2:]
        if not files:
            raise IndexError('input category file')
    except IndexError as e:
        raise ValueError('---------argv errors-------')
    cate = Category()
    for file in files:
        try:
            cate.run(file)
        except Exception as e:
            print e
            print u"" +file+ u"】导入失败"