windows下python3 使用cx_Oracle,xlrd插件进行excel数据清洗录入

我们在做数据分析,清洗的过程中,很多时候会面对各种各样的数据源,要针对不同的数据源进行清洗,入库的工作。当然python这个语言,我比较喜欢,开发效率高,基本上怎么写都能运行,而且安装配置简单,基本上有网的环境pip install全部都搞定,没网的话,把whl包copy过来一行命令也就解决了(windows下python3.5使用pip离线安装whl包)。

本篇博客就针对,在windows平台下使用python3(python2社区将要停止支持,使用3是大势所趋),读取xls,xlsx格式的数据进行清洗入库做一个小例子。

初步业务流程

整个业务的流程十分简单:两个大的步骤

1. 读取xlsx数据进行清洗
2. cx_Oracle批量入库

建表语句:

create table temp_table
(
importtime varchar2(128),
carrier varchar2(32),

);

select * from temp_table

一个例子脚本:

# -*- coding: utf-8 -*-

import xlrd
import datetime
import cx_Oracle
import time
from itertools import islice
import os
os.environ[‘NLS_LANG‘]=‘SIMPLIFIED CHINESE_CHINA.ZHS16GBK‘

LineName = [‘1号线‘,‘2号线‘]
StationName = []

########################链接数据库相关######################################

def getConnOracle(username,password,ip,service_name):
    try:
        conn = cx_Oracle.connect(username+‘/‘+password+‘@‘+ip+‘/‘+service_name)  # 连接数据库
        return conn
    except Exception:
        print(Exception)

#######################进行数据批量插入#######################

def insertOracle(conn,data,input_file_name):
    sheetnumber = getSheetNumber(data)
    cursor = conn.cursor()
    try:
        for x in range(0,sheetnumber):
            templist = excel_table_byindex(input_file_name,0,x)
            cursor.prepare(‘insert into temp_table(importtime ,carrier) values(:1,:2)‘)
             # 使用cursor进行各种操作,templist数值需要和表temp_table对应
             cursor.executemany(None,templist)

        conn.commit()
    except cx_Oracle.DatabaseError as msg:
        print(msg)
    finally:
        cursor.close()
        conn.close()

###########################打开excel文件########################
def openXLS(path):
    try:
        data = xlrd.open_workbook(path)
        return data
    except Exception:
        print(Exception)

def getSheetNumber(data):
    sheet_num = len(data.sheets())
    return sheet_num
#######################一些数据清洗工作########################
def getlineName(str):
    for x in LineName:
        if x in str:
            return  x

def getStationName(str):
    for x in StationName:
        if x in str:
            return x
##########将excel中除去表头的一个sheet读出来,返回一个list#############
def excel_table_byindex(path,colnameindex = 0,by_index = 0):
    today = time.strftime(‘%Y%m%d‘, time.localtime(time.time()))
    data = openXLS(path)
    table = data.sheets()[by_index]
    nrows = table.nrows
    ncols = table.ncols

    colnames = table.row_values(colnameindex)
    list = []
    for rownum in range(1,nrows):
        row = table.row_values(rownum)
        temp_lineName = getlineName(row[6])
        temp_stationName = getStationName(row[6])
        if row:
            app = [today, str(row[1]), str(row[2]),temp_stationName,temp_lineName]
            # for i in range(len(colnames)):
            #     app[colnames[i]] = row[i]
            list.append(app)
    return list

###################一个可以从文件第二行开始读的办法#############

def getAllStationName(path):
    StationName_file = open(path, ‘r‘, encoding=‘utf-8‘)
    #count = len(StationName_file.readlines())

    for line in islice(StationName_file,1,None):
        str_temp = line.strip(‘\n‘)
        if str_temp not in LineName and str_temp !=‘----‘and str_temp!=‘‘:
            StationName.append(str_temp)

####################################################################
def getStationNamefromexcel(path):

    data = openXLS(path)
    table = data.sheets()[0]
    nrows = table.nrows
    ncols = table.ncols
    colnames = table.row_values(0)
    list = []
    for rownum in range(0,nrows):
        row = table.row_values(rownum)[0]
        if row:
            list.append(row)
    return list

#################################################################
def main():
    username = ‘xx‘
    password = ‘xx‘
    ip = ‘192.168.1.1‘
    service_name = ‘iop‘
    #获取数据库链接
    conn = getConnOracle(username,password,ip,service_name)

    input_file_name = (r"E:\code\python\findS\subwayBase\xx.xlsx")
    #output_file_name = input("Enter the output file name:")
    getAllStationName(r"E:\code\python\findS\subwayBase\站点.txt")

    begin = datetime.datetime.now()

    insertOracle(conn,openXLS(input_file_name),input_file_name)

    # x.fetchone()
    # c.close()  # 关闭cursor
    # conn.close()  # 关闭连接

    end = datetime.datetime.now()
    print((end - begin).seconds)

if __name__ ==‘__main__‘:
    main()

python3 windows下使用cx_Oracle操作oracle的报错问题

报错信息如下:

Traceback (most recent call last):
  File "E:/code/python/findS/findSubwayBase.py", line 134, in <module>
    main()
  File "E:/code/python/findS/findSubwayBase.py", line 124, in main
    insertOracle(conn,openXLS(input_file_name),input_file_name)
  File "E:/code/python/findS/findSubwayBase.py", line 32, in insertOracle
    cursor.executemany(None,templist)
UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 1-6: ordinal not in range(128)

Process finished with exit code 1

在使用python3 的cx_Oracle操作oracle数据时候,不可避免的会遇到中文的编码问题,当然,上网一搜全是python2的,解决方案是:

#在开头加上
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

python3中的解决方案为:加上核心代码

import os
os.environ[‘NLS_LANG‘]=‘SIMPLIFIED CHINESE_CHINA.ZHS16GBK‘

就ok啦,其实就是设置一下客户端编码 ,参考:python编码 OS.ENVIRON详解

xlrd 操作excel

demo代码:

#获取一个工作表

table = data.sheets()[0]          #通过索引顺序获取

table = data.sheet_by_index(0) #通过索引顺序获取

table = data.sheet_by_name(u‘Sheet1‘)#通过名称获取

#获取整行和整列的值(数组)
   
table.row_values(i)

table.col_values(i)

#获取行数和列数
  
nrows = table.nrows
ncols = table.ncols

#循环行列表数据
for i in range(nrows ):
      print table.row_values(i)

#单元格
cell_A1 = table.cell(0,0).value

cell_C4 = table.cell(2,3).value

#使用行列索引
cell_A1 = table.row(0)[0].value

cell_A2 = table.col(1)[0].value

#简单的写入
row = 0

col = 0

# 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
ctype = 1 value = ‘单元格的值‘

xf = 0 # 扩展的格式化

table.put_cell(row, col, ctype, value, xf)

table.cell(0,0)  #单元格的值‘

table.cell(0,0).value #单元格的值‘

参考链接

[OS.ENVIRON详解]: http://blog.csdn.net/junweifan/article/details/7615591
[python编码]:http://www.cnblogs.com/fkissx/p/5417363.html

再次强烈推荐,精通oracle+python系列:官方文档

http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python-1391323-zhs.html

时间: 2024-10-05 20:52:54

windows下python3 使用cx_Oracle,xlrd插件进行excel数据清洗录入的相关文章

windows下安装python +eclipse pydev 插件

目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(IDE) 1. 在Eclipse中安装PyDev插件 2. 配置Python Interpreters 四. 创建Python Project 五. 编写HelloWorld 六. 小结 一. Python简介: Python在Linux.windows.Mac os等操作系统下都有相应的版本,不管在什么操作系统下,它都能够正常工作

windows下python3.x的安装与使用

Python的3.x版本,相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.x在设计的时候没有考虑向下兼容. 1.windows下安装Python3.x 2.安装后开启程序,在开始下运行Python3.6.0 3.编写几个代表性小程序 一.print得使用 二.input的使用 三.list与enumerate的使用 四.运算符

windows下python3和python3共存

在linux下,可以利用alias命令解决python3和python2的共存问题,其实在windows下同样可以利用这个思路解决python2和python3的共存问题,只不过步骤稍显繁琐. 首先建立一个bat文件,建立别名的对应关系. @doskey python3="c:\Users\Administrator\Anaconda3\python.exe" $* @doskey ipython3="C:\Users\Administrator\Anaconda3\Scri

Windows下Python3+nose+appium自动化测试之Android实战篇

简介 以下用来做自动化测试的这款app叫最爱抓娃娃,以后会改名为网易抓娃娃. 下文提到的appiumier项目里会包含用来测试的apk包以及自动化测试代码. 先说一个坑 随着Android机高度定制的大潮,有些手机是这样的,比如Vivo x9s,你在做测试调试的过程中最终会发现跳转到某些页面后driver却进不去这个页面,page_souce也没法打印,所以什么元素你都获取不到.唯一的解决办法就是换个手机.后来我换了一个中兴手机,问题消失了. 准备工作 这里我列举下在Windows下用pytho

Windows下python3生成UTF8的CSV文件和sha256sum踩坑记录

CSV的坑 在Ubuntu下是简单的写入完事 import csv ... with open(filename, 'w') as output: f = csv.writer(output) f.writerow(results[0].keys()) .在win7下, 用msys2环境执行同一个python脚本, 发现生成的csv有两个问题: 1)有空行, 2)编码变成了GB2312 关于空行的问题, 百度的结果都是open(filename, 'wb')来解决, 但是在python3下会报

windows下 python3.5+tensorflow 安装

个人随笔,备忘参考 首先最近的tensorflow 对python3.5.x友好,我先装了Python3.6,查其他的一些博客说出现问题,后来重装3.5.0.下载用迅雷,超快. 安装比较简单,官网下载,然后安装,安装时记得勾选add path,下面贴了博客参考 windows系统下Python环境的搭建 - InSky - 博客园http://www.cnblogs.com/windinsky/archive/2012/09/20/2695520.html 然后cmd  或者win+r 运行Py

Windows下Python3.6安装PIL

PIL是Python平台事实上的图像处理标准库,需要用到图片的需要导入该模块 一 安装pip https://pip.pypa.io/en/stable/installing/#id8 python -m pip install -U pip 二 选择PIL 官方没有支持python3.6的PIL库,所以用pillow代替 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pillow windows 64位 python36:选择Pillow?4.2.0?c

Windows下使用Hadoop2.6.0-eclipse-plugin插件

首先说一下本人的环境: Windows7  64位系统 Spring Tool Suite  Version: 3.4.0.RELEASE Hadoop2.6.0 一.简介 Hadoop2.x之后没有Eclipse插件工具,我们就不能在Eclipse上调试代码,我们要把写好的java代码的MapReduce打包成jar然后在Linux上运行,所以这种不方便我们调试代码,所以我们自己编译一个Eclipse插件,方便我们在我们本地上调试,经过hadoop1.x的发展,编译hadoop2.x版本的ec

windows下python3和python2虚拟环境配置

Python3 被越来越多的开发者所接受,同时让人尴尬的是很多遗留的老系统依旧运行在 Python2 的环境中,因此有时你不得不同时在两个版本中进行开发,调试. 如何在系统中同时共存 Python2 和 Python3 是开发者不得不面对的问题,一个利好的消息是,Anaconda 能完美解决Python2 和 Python3 的共存问题,而且在 Windows 平台经常出现安装依赖包(比如 MySQL-python)失败的情况也得以解决. Anaconda 是什么? Anaconda 是 Pyt