1. # -*- coding:utf-8 -*-
  2. """
  3. 从文件导入分类 根据行首制表符或空格确定层级关系(4个空格等于一个制表符 同一行制表符和空格不能混用 )
  4. 必须是 utf-8编码
  5.  
  6. -------test.txt-------
  7. 鞋子
  8. 运动鞋
  9. 凉鞋
  10. 拖鞋
  11. 靴子
  12. 体育
  13. 羽毛球
  14. 单打
  15. 双打
  16. 游泳
  17. ----------------------
  18. """
  19.  
  20. import redis
  21. import MySQLdb
  22. import json
  23.  
  24. class Category(object):
  25.  
  26. cache = redis.StrictRedis(host='localhost',port = 6379,db=0)
  27. conn = MySQLdb.Connect(host='192.168.1.222', user='root', passwd='', db='gmian',charset='utf8')
  28.  
  29. """
  30. 打开文件 读取每一行进行处理
  31. """
  32. def run(self,category_file):
  33. f = open(category_file,'r')
  34. while True:
  35. #print isinstance(line, unicode) # 检测是否为unicode
  36. #print unicode(line,"utf-8")
  37. line = f.readline()
  38. if line:
  39. self.writeCate(line)
  40. else:
  41. break
  42. f.close()
  43.  
  44. #删除缓存
  45. def __del__(self):
  46. keys = self.__class__.cache.smembers('category_keys')
  47. for key in keys:
  48. self.__class__.cache.delete(key)
  49. self.__class__.cache.delete('category_cateid')
  50. self.__class__.cache.delete('category_keys')
  51.  
  52. #获取自动增长的ID
  53. @classmethod
  54. def getincr(cls):
  55. return int(cls.cache.incr('category_cateid')) + DB_AUTO_INSERT
  56.  
  57. # 把分类添加进按层级分别的列表中
  58. @classmethod
  59. def add(cls,num,catename):
  60. id = cls.getincr()
  61. cls.insert_db(id,num,catename)
  62. cls.cache.sadd('category_keys','category_level_'+str(num))
  63. cls.cache.lpush('category_level_'+str(num),json.dumps([id,catename]))
  64.  
  65. #获取父类
  66. @classmethod
  67. def getparentid(cls,num):
  68. parent = cls.cache.lindex('category_level_'+str(num-1),0)
  69. if not parent:
  70. raise NameError('STOP !! 没找到父类')
  71. parent = json.loads(parent)
  72. return parent[0]
  73.  
  74. @classmethod
  75. def writeCate(cls,line):
  76. num,catename = cls.getLevelNum(line)
  77. cls.add(num,catename)
  78.  
  79. @classmethod
  80. def insert_db(cls,id,num,catename):
  81. if num:
  82. pid = cls.getparentid(num)
  83. else:
  84. pid = 0
  85. cursor = cls.conn.cursor()
  86. 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,''))
  87. cls.conn.commit()
  88.  
  89. # 要么全部是 \t 要么全部是空格 空格4个为一个单位
  90. @staticmethod
  91. def getLevelNum(str):
  92. i = 0
  93. while str[i] == '\t':
  94. i+=1
  95. if i:
  96. return i,str[i:]
  97. while str[i] == ' ':
  98. i+=1
  99. if not i:
  100. return 0,str
  101. return i/4,str[i:]
  102.  
  103. if __name__ == '__main__':
  104. # >$ python category.py 153(DB_AUTO_INSERT) cate1.txt cate2.txt ...
  105.  
  106. import sys
  107. try:
  108. DB_AUTO_INSERT = int(sys.argv[1]) # 已存在的最大ID 否则ID重复 插入失败
  109. files = sys.argv[2:]
  110. if not files:
  111. raise IndexError('input category file')
  112. except IndexError as e:
  113. raise ValueError('---------argv errors-------')
  114. cate = Category()
  115. for file in files:
  116. try:
  117. cate.run(file)
  118. except Exception as e:
  119. print e
  120. print u"【" +file+ u"】导入失败"

python 从文件导入分类的更多相关文章

  1. 关于python中文件导入的若干问题

    __init__文件 同一级目录下直接import导入就可以了,如果是在不同的目录下面被导入文件的文件夹下面必须有__init__.py文件,即使这个文件是空的也可以.当然这个文件也可以初始一些数据 ...

  2. python将文件导入字典

    a={}i=0f = open("filepath","r")for line in f.readlines(): a[i] =line i=i+1 a是字典, ...

  3. appium+python自动化51-adb文件导入和导出(pull push)

    前言 用手机连电脑的时候,有时候需要把手机(模拟器)上的文件导出到电脑上,或者把电脑的图片导入手机里做测试用,我们可以用第三方的软件管理工具直接复制粘贴,也可以直接通过adb命令导入和导出. adb ...

  4. appium+python自动化-adb文件导入和导出(pull push)

    前言 用手机连电脑的时候,有时候需要把手机(模拟器)上的文件导出到电脑上,或者把电脑的图片导入手机里做测试用,我们可以用第三方的软件管理工具直接复制粘贴,也可以直接通过adb命令导入和导出. adb ...

  5. Python实现鸢尾花数据集分类问题——基于skearn的NaiveBayes

    Python实现鸢尾花数据集分类问题——基于skearn的NaiveBayes 代码如下: # !/usr/bin/env python # encoding: utf-8 __author__ = ...

  6. Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression

    Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression 一. 逻辑回归 逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题, ...

  7. Python实现鸢尾花数据集分类问题——基于skearn的SVM

    Python实现鸢尾花数据集分类问题——基于skearn的SVM 代码如下: # !/usr/bin/env python # encoding: utf-8 __author__ = 'Xiaoli ...

  8. Python模块及其导入

    一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...

  9. 将.dat文件导入数据库

    *最近在搞文本分类,就是把一批文章分成[军事].[娱乐].[政治]等等. 但是这个先需要一些样本进行训练,感觉文本分类和"按图索骥"差不多,训练的文章样本就是"图&quo ...

随机推荐

  1. jQuery 操作html元素

    1. 添加元素 动态添加html 元素是一个非常重要的功能. jQuery可以非常方便的做这样的事情: $h1 = $('<h1>Hello</h1>') $(".i ...

  2. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element ‘dubbo:application’. – schema_reference.4: Failed to read schema document

    解决办法: 1.直接百度下载一个dubbo.xsd文件 2.myeclispe-->window-->preferences-->xml catalog-->add 完美解决!

  3. 数位DP 求K进制下0~N的每个数每位上出现的数的总和

    好久没写博客了,因为感觉时间比较紧,另一方面没有心思,做的题目比较浅也是另一方面. 热身赛第二场被血虐了好不好,于是决定看看数位DP吧. 进入正题: 如题是一道经(简)典(单)的数位dp. 第一步,对 ...

  4. checkbox的单选全选,反选,计算价格,删除

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  5. 设置Ubuntu 14.04右键终端的方法

    设置Ubuntu 14.04右键终端的方法如下: 首先要安装一个包,即可在右键里面添加一个"打开终端"的菜单. sudo apt-get install nautilus-open ...

  6. objective C 学习之02

    1. 函数 -(void) HelloWorld:(BOOL)ishelloworld{ //干点啥 } 前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的.对应的有+号, 代表是类的 ...

  7. Android--菜单详解

    Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单. 选项菜单: 一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种.最常用的是干版本创建 ...

  8. manacher浅析

    manacher算法的输入是一个字符串,可以计算出以每个字符为中心的最长回文子串的半径.为了避免讨论奇数偶数,将原串的每两个字母之间以及前后各加一个特殊字母,比如'#',那么对于abcbb就变成了 # ...

  9. STM32学习笔记(五) USART异步串行口输入输出(轮询模式)

    学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...

  10. hdu 2177 取(2堆)石子游戏(威佐夫博奕)

    题目链接:hdu 2177 这题不是普通的 Nim 博弈,我想它应该是另一种博弈吧,于是便推 sg 函数打了个 20*20 的表来看,为了方便看一些,我用颜色作了标记,打表代码如下: #include ...