Chinaunix首页 | 论坛 | 博客
  • 博客访问: 211696
  • 博文数量: 39
  • 博客积分: 420
  • 博客等级: 下士
  • 技术积分: 457
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-01 10:22
文章分类

全部博文(39)

文章存档

2015年(15)

2014年(11)

2013年(1)

2012年(2)

2011年(1)

2010年(9)

我的朋友

分类: Python/Ruby

2014-10-23 16:01:46

一、说明:
    (1)在linux系统下通过shell脚本执行python脚本
    (2)txt文件的编码为utf8
    (3)插入window系统中的sql server 2000

二、代码说明
    (1)首先创建表结构

点击(此处)折叠或打开

  1. CREATE TABLE [dbo].[POWER_METER_CFG_MV] (
  2.     [STATION_ID] [int] NOT NULL ,
  3.     [DEVICE_ID] [int] NULL ,
  4.     [DATA_OBJECT_ID] [int] NULL ,
  5.     [OBJECT_NAME] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL
  6. )
    (2)txt文件内容

点击(此处)折叠或打开

  1. 366,207,7089,油机输入开关
  2. 363,299,10236,油机输入开关
  3. 287,286,9773,主设备2开关
  4. 287,284,9685,机房空调2开关
  5. 287,285,9729,油机输入开关
  6. 365,210,7247,主设备2开关
  7. ,104,3557,市电总输入开关
  8. ,105,3601,主设备1开关
    (3)配置连接数据库的ip,用户名,密码,数据库名文件:config.py

点击(此处)折叠或打开

  1. import csv
  2. import sys

  3. db_host = '192.168.0.33'
  4. db_name = 'EnergyCfg'
  5. db_username = 'sa'
  6. db_password = ''
    (4)连接数据库python模块代码文件:db.py

点击(此处)折叠或打开

  1. import os
  2. import pymssql
  3. import config

  4. os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
  5. db_pool = None

  6. def getPool():
  7.     global db_pool
  8.     if(db_pool == None):
  9.         db_pool = pymssql.connect(config.db_host,user=config.db_username,password=config.db_password,database=config.db_name, charset='cp936')
  10.     return db_pool

  11. def getConnection():
  12.     return getPool()

  13. def releaseConnection(conn):
  14.     return getPool().close()
    由于sql server 2000是属于中文编码,因此在连接时要指定编码,如:charset='cp936'
    (5)插入数据库代码文件:insert_config.py

点击(此处)折叠或打开

  1. #!/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import csv
  4. import sys
  5. import datetime
  6. import db

  7. def init():
  8.     infile = sys.stdin
  9.     outfile = sys.stdout
  10.     if(len(sys.argv) > 1) :
  11.         infile = open(sys.argv[1], 'rb')
  12.     reader = csv.reader(infile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL, skipinitialspace=True)
  13.     writer = csv.writer(outfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL, skipinitialspace=True)
  14.     return reader, writer

  15. def insert2(lst,cursor):
  16.     cur=cursor.cursor()
  17.     for value in lst:
  18.         sql="""insert into POWER_METER_CFG_MV (STATION_ID,DEVICE_ID, DATA_OBJECT_ID,OBJECT_NAME)VALUES(%d,%d,%d,'%s')""" % (value[0],value[1],value[2],value[3])
  19.         cur.execute(sql)
  20.     conn.commit()
  21.     cur.close()

  22. if __name__ == '__main__':
  23.     reader, writer = init()
  24.     conn = db.getConnection()
  25.     lst=[]
  26.     try:
  27.         print datetime.datetime.now()
  28.         for row in reader:
  29.             if row[0] and row[1] and row[2] and row[3]:
  30.                 alarm = (int(row[0]), int(row[1]), int(row[2]),row[3].decode("utf-8").encode('gbk'))
  31.                 lst.append(alarm)
  32.         insert2(lst,conn)
  33.         print datetime.datetime.now()
  34.     except Exception:
  35.         conn.rollback()
  36.         raise
  37.     finally:
  38.         db.releaseConnection(conn)
    由于txt文件编码是utf8的,因此需要先使用decode("utf-8")进行解码,然后再使用encode('gbk')转换成gbk编码
    (6)执行py文件的shell脚本文件:insert_config.py

点击(此处)折叠或打开

  1. # !/bin/sh
  2. insert_config() {
  3. cat POWER_METER_CFG |python insert_config.py
  4. }
  5. insert_config
    先通过系统命令cat POWER_METER_CFG 将内容输出到终端,然后insert_config.py再从终端读取内容。

代码文件:insert.rar

阅读(2284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~