我们在做数据分析,清洗的过程中,很多时候会面对各种各样的数据源,要针对不同的数据源进行清洗,入库的工作。当然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

离线版本下载链接:

http://download.csdn.net/detail/wangyaninglm/9815726

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

  1. windows下python3.6 32bit 安装django

    在Windows下python3.6安装Django1.11.3 1.首先下载地址:https://pypi.python.org/pypi/Django/1.11.3 pip install dja ...

  2. windows下python3.6安装pycryto or crypto or pycryptodome与使用

    pycrypto,pycrytodome和crypto是一个东西,在很久以前,crypto在python上面的名字是pycrypto它是一个第三方库,但是已经停止更新三年了,所以不建议安装这个库: w ...

  3. Windows下python3登陆和操作linux服务器

    一.环境准备 python3远程连接需要用到pycrytodome和paramiko库,其中后者依赖前者,所以按照顺序来安装 1. 安装pycrytodome 1 pip install pycryt ...

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

    CSV的坑 在Ubuntu下是简单的写入完事 import csv ... with open(filename, 'w') as output: f = csv.writer(output) f.w ...

  5. Windows下Python3+nose+appium自动化测试之Android篇

    [本文出自天外归云的博客园] 简介 以下用来做自动化测试的这款app叫最爱抓娃娃,以后会改名为网易抓娃娃. 下文提到的appiumier项目里会包含用来测试的apk包以及自动化测试代码. 先说一个坑 ...

  6. Windows下Python3.7的安装

    1.下载Python3官网地址:www.python.org当前最新版本为Python 3.7.3. Windows下有个6个下载链接Windows x86-64 embeddable zip fil ...

  7. windows下python3.7安装gmpy2、Crypto 库及rsa

    基于python3.7在windows下安装gmpy2 先检查一下是否安装了wheel文件包,在cmd中输入wheel,查看一下,如果没有安装,则输入安装:pip install wheel 如果遇到 ...

  8. [No000054] Windows 下Python3.5, NoteBook增强版安装

    接着上周继续,没看的童鞋.请移步: http://www.cnblogs.com/Chary/p/No00004B.html 这里,假设你已经能够看到这个画面了: 接下来,我们继续 给药 : 安装no ...

  9. windows 下的tcping 小插件

    如果把插件放在根目录 就要能过cmd切换到根目录 cd \ c:\>tcping -d -t -i 0.06 www.baidu.com 将文件放在c:\WINDOWS\system32目录下, ...

随机推荐

  1. Android开发之使用Web Service进行网络编程

    使用Web Service进行网络编程 Android应用通常都是执行在手机平台上.手机系统的硬件资源是有限的,无论是存储能力还是计算能力都有限.在Android系统上开发.执行一些单用户.小型应用是 ...

  2. poj3352Road Construction 边双连通+伪缩点

    /* 对于边双连通分支,求法更为简单. 仅仅需在求出全部的桥以后,把桥边删除.\ 原图变成了多个连通块,则每一个连通块就是一个边双连通分支. 桥不属于不论什么 一个边双连通分支,其余的边和每一个顶点都 ...

  3. js算法:分治法-棋盘覆盖

    在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...

  4. ios修改了coredata数据结构后,更新安装会闪退

    如果iOS App 使用到CoreData,并且在上一个版本上有数据库更新(新增表.字段等操作),那在覆盖安装程序时就要进行CoreData数据库的迁移,具体操作如下: 1.选中你的mydata.xc ...

  5. Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转

    原文来自:聊聊架构公众号 前面的文章中有说到微服务的通信方式,Martin Folwer 先生在他对微服务的定义中也提到“每个服务运行在其独立的进程中,服务与服务间采用 轻量级的通信机制 互相协作(通 ...

  6. 解码URLDecode和编码URLEnCode

    在前台往后台传递参数的时候,在前台进行编码,在后台接收参数的时候,用Decode进行解码: 如果url中包含特殊字符如:&.html标签 <tr><td>等导致url无 ...

  7. 洛谷P1136 迎接仪式 动态规划

    显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...

  8. 51nod 1325 两棵树的问题(最大权闭合子图)

    首先如果点权全都为正,就可以直接选所有的点. 活在梦里.. 考虑枚举一个点\(i\),作为我们选择的集合中的一个点. 然后我们把另一个点\(j\)选入集合的时候必须把两棵树中\(i\)和\(j\)路径 ...

  9. Javascript系列——对象元素的数组去重实现

    概要 这是一篇记录文,记录数组操作对象去重的实现. 需求 有这样一个数组 [{ _id: 123, name: '张三' },{ _id: 124, name: '李四' },{ _id: 123, ...

  10. 让div垂直居中

    参考链接:https://www.cnblogs.com/softwarefang/p/6095806.html 以前我的方法总是比较粗暴,纯粹通过margin来实现,这个方法的缺点不仅在于需要多次微 ...