怎样用python,python 读取excel列中的一列数据

python初学—-实现excel里面读数据进行排序(改进算法)
时间: 00:42:15
&&&& 阅读:106
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&#coding:GBK
import&xlrd
import&xlwt
import&time
def&read_excel(c):
&&&&if&c==0:
&&&&&&&&print&"使用率排名:"
&&&&&&&&for&i&in&range(1,sheet.nrows):
&&&&&&&&&&&&lie[sheet.cell(i,c).value.encode(‘GBK‘)]&=&sheet.cell(i,c+1).value*(100/50)
&&&&&&&&&&&&i&=&i+1
&&&&&&&&newlie&=&sorted(lie.iteritems(),key&=&lambda&d:d[1],reverse&=&True)
&&&&&&&&for&i&in&range(0,len(newlie)):
&&&&&&&&&&&&print&newlie[i][0]+":"+str(newlie[i][1])+"分,"&,
&&&&&&&&&&&&i&=&i+1
&&&&&&&&print&"\n"
&&&&&&&&return
&&&&print&sheet.cell(0,c).value.encode(‘GBK‘)+":"
&&&&for&i&in&range(1,sheet.nrows):
&&&&&&&&lie[sheet.cell(i,0).value.encode(‘GBK‘)]&=&sheet.cell(i,c).value
&&&&&&&&i&=&i+1
&&&&newlie&=&sorted(lie.iteritems(),key&=&lambda&d:d[1],reverse&=&True)
&&&&for&i&in&range(0,len(newlie)):
&&&&&&&&print&newlie[i][0]+":"+"%.1f"&%(newlie[i][1])+"分,"&,
&&&&&&&&i&=&i+1
&&&&print&"\n"
start&=&time.time()
if&__name__&==&‘__main__‘:
&&&&URL&=&r‘D:\python&case\0.excel分数排序-\fenshu.xlsx‘
&&&&workbook&=&xlrd.open_workbook(URL,‘rb‘)
&&&&sheet_name&=&workbook.sheet_names()[1]
&&&&sheet&=&workbook.sheet_by_index(1)
&&&&sheet&=&workbook.sheet_by_name(‘Sheet1‘)
&&&&lie&=&{}
&&&&print&‘-‘*20
&&&&for&c&in&range(0,5):
&&&&&&&&read_excel(c)
&&&&c&=&time.time()&-&start
&&&&print(‘程序运行耗时:%0.2f‘%(c))本文出自 “” 博客,请务必保留此出处标签:&&&&&&&&&
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!python基础 实战作业(1) ---Excel基本读写与数据处理
看完本篇需要:10min作业练习需要:0.5h~3h(依练习者对python熟悉程度而定)看完本篇可以学到:1、用xlrd模块读取Excel文件中的数据2、用xlsxwriter模块向Excel文件写入数据并保存3、用time和datetime模块将字符串转换成时间类,并进行时间的比较本篇目录作业需求整体思路详细实现步骤3.1. 读取表格数据3.2. 将行数据list按时间先后升序排序3.3. 维护一个map并新增数据到行数据3.4. 将修改后的行数据list写入Excel表格并保存为xslx格式完整代码结果展示参考源码及作业练习文件作业需求图1.待处理Excel文件一个朋友在某运动品牌公司上班,老板给他布置了一个处理客户订单数据的任务。要求是根据订单时间和客户id判断生成四个新的数据:1、记录该客户是第几次光顾2、上一次的日期时间是什么时候3、与上次订单的间隔时间4、这是一个existing客户还是一个new客户(见定义)文件说明:1、第一列是订单日期和时间(乱序)2、第二列是客户的id3、第三列不需要使用相关定义如下:1、existing:此次下单日期时间与上次日期时间的距离在N天以内,精确到时间(时分秒)2、new:即超过N天整体思路1、读取表格的行数据存储成list,并按照时间列的升序排序。2、维护一个map(在python里是字典dict),每个用户 id 作为key,一个二元组(第几次下单,上一次的日期时间)作为value。3、遍历表格行数据的list。判断客户 id 是否已经存在于map中,若首次出现,则置该客户 id 在map中的value为[1,'首次下单'],对应行数据新增的4个数据为[1,'首次下单',该次日期时间与上次日期时间差,'new']。若已经存在,则更新map中对应的value为[原次数+1,该次日期时间],对应行数据新增的4个数据为[原次数+1,上次日期时间,间隔时间,new/existing取决于间隔时间与预设N]。4、将修改过后的行数据list写入到Excel工作簿并保存。详细实现步骤读取表格数据我们可以用xlrd模块对Excel文件进行读取,以便进一步分析处理数据。示例代码如下:wb=xlrd.open_workbook('../excel/buyer_day.xlsx')# 打开工作簿,参数为文件地址 sheet=wb.sheets()[0]# 获取工作簿中的第一张工作表 for i in range(100):
if i==0:# 跳过首行的标题
time_str= sheet.row_values(i)[0]# 读取该工作表第i行的第一个单元格数据
print time_str以上代码成功输出前100行的日期则说明已经成功读取到数据。输出结果如下:图2.输出示例可以看到,这里输出的日期前后有空格,而且最后的时间有小数点,这不便于我们转换成时间类,所以要进行一些处理。用strip函数去掉前后空格,用切片切掉末尾的".0"。将前面的第4行代码更改为:time_str= sheet.row_values(i)[0].strip()[:-2]既然读取文件没有问题,进一步浏览整个文件发现存在多余的空行和重复的标题行(如图3),在读取和转存中可以用正则匹配过滤掉这些行。图3.目标表格中段另外,可以从图2看出时间是乱序的,这不利于后续的逻辑实现,所以将读取的行数据转存到list中,以便进行排序。list_row=[]# 将行数据存储到list中,便于排序
wb=xlrd.open_workbook('../excel/buyer_day.xlsx') sheet=wb.sheets()[0] nrows=sheet.nrows# 工作表的行数
for i in range(nrows):
#用正则匹配过滤掉空行和标题行
str_date=sheet.row_values(i)[0].strip()[:-2]
if re.match('[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}', str_date)!=None:
list_row.append(sheet.row_values(i))# 插入到list将行数据list按时间先后升序排序这里用到sorted函数,可以对list进行排序。示例代码如下,key指定的函数会作用于list中的每一个元素,其返回值必须为可比较的变量。list_row=sorted(list_row,key=self.getDatetime)# 将list_row排序,排序是对key进行比较,key指定的函数会作用于list中的每一个元素行数据的第一格的日期时间字符串不便于直接比较,可以转换成datetime对象,以便直接比较。具体做法是将读取到的日期时间字符串用time模块的strptime转换成时间类,再用datetime模块转换成datetime类。timeArray=time.strptime(time_str, "%Y-%m-%d %H:%M:%S")# 第二个参数是对应字符串的格式 Y,m,d,H,M,S=timeArray[0:6]
dt=datetime.datetime(Y,m,d,H,M,S)# 转换成datetime对象,可以直接进行比较datetime之间的比较可以直接用&,&,=符号,而且可以直接相减求间隔时间,间隔时间的类型是timedelta,也可以直接比较。示例代码如下:dt1=datetime.datetime(,13,23,01) dt2=datetime.datetime(,12,00,00) dt3=datetime.datetime() dt4=datetime.datetime()
dis1=dt1-dt2# 相减返回的类型是timedelta dis2=dt3-dt4 print dis1 print dis2 print dis1&dis2 print dis1&datetime.timedelta(days=30)示例输出:图4.输出示例维护一个map并新增数据到行数据map={客户 id :[第几次下单,上次日期时间]}搞清楚了日期时间的比较和时间间隔的比较,我们就可以按之前整体思路的2、3步的逻辑进行map的维护更新和list中行数据的修改了。逻辑之前已经提过了,细节见代码注释。for row_value in list_rowValues:
dt_current=self.getDatetime(row_value)# 订单日期时间的datetime类型
mber_id=row_value[1].strip()# 客户id
# 维护一个dict,用一个dict保存,客户id作为key,[当前第几次,上次订单日期时间]作为value
# 并且依此写入新数据到list的行数据中
if mber_id in self.dict_mid_data: # 如果存在这个key,说明该顾客之前有订单记录,更新dict,同时插入新数据到row_value
self.dict_mid_data[mber_id][0]+=1# 更新下单次数+1
row_value[3]=self.dict_mid_data[mber_id][0]# 插入下单次数
dt_last=self.dict_mid_data[mber_id][1]
row_value[4]=dt_last.strftime("%Y-%m-%d %H:%M:%S")# 插入上次订单日期时间
dis=abs(dt_current-dt_last)# 时间差的绝对值
row_value[5]=str(dis)# 插入与上次订单时间的间隔时间差
# 插入usertype
if dis &= datetime.timedelta(days=N):# 如果间隔在N天内
row_value[6]='existing'
row_value[6]='new'
if dt_current&dt_last:# 如果当前时间更近,更新dict里的上次日期时间
self.dict_mid_data[mber_id][1]=dt_current
else:# 不存在这个key,直接保存初始值
self.dict_mid_data[mber_id]=[1,dt_current]
row_value[3]=1 # 当前是第几次订单
row_value[4]=u'首次下单' # 当前日期时间
row_value[5]='-' # 与上次订单间隔时间
row_value[6]='new' # usertype将修改后的行数据list写入Excel表格并保存为xslx格式xlrd模块读取的工作簿是不能修改的,也就是只能读,不能写。想要新增数据进原来的工作簿,要用到xlsxwriter模块生成新的Excel工作簿,然后把修改后的list写入到一张新的工作表中,再保存到原路径(或者新的路径),以达到修改的目的。wb=xlsxwriter.Workbook('../excel/buyer_day_new.xlsx') sheet=wb.add_worksheet('sheet1')# 新增一张工作表sheet1 # 写入标题 sheet.write(0,0,'order_dt')# 三个参数分别是:单元格横坐标,纵坐标,写入内容 sheet.write(0,1,'member_id') sheet.write(0,2,'member_type') sheet.write(0,3,'times') sheet.write(0,4,'last_order_dt') sheet.write(0,5,'interval') sheet.write(0,6,'user_type')
# 写入处理后的数据 len_list=len(list_rowValues) for i in range(len_list):
row_value=list_rowValues[i]
len_row=len(row_value)
for j in range(len_row):
sheet.write(i+1,j,row_value[j])
wb.close()完整代码# -*- coding:utf-8 -*- ''' Created on 日
@author: wycheng ''' import xlrd import xlsxwriter import time,datetime import re
class BuyerManager:
dict_mid_data={}# 维护的一个 map{客户id:[第几次下单,上次日期时间]}
# 获取对应行数据的订单时间
def getDatetime(self,row_value):
time_str=row_value[0].strip()[:-2]
timeArray=time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
Y,m,d,H,M,S=timeArray[0:6]
dt_current=datetime.datetime(Y,m,d,H,M,S)# 转换成datetime对象,可以直接进行比较
return dt_current
# 将所有工作表的行按照订单日期升序排序
def getList_sorted(self,list_xl):# list_xl: Excel文件的地址list
list_row=[]# 将行数据存储到list中,便于排序
for exl in list_xl:
print u'正在打开文件 '+exl
wb=xlrd.open_workbook(exl)
sheet=wb.sheets()[0]
nrows=sheet.nrows# 工作表的行数
print u'正在插入文件 '+exl+u'的row_value'
for i in range(nrows):
#用正则匹配过滤掉空行和标题行
str_date=sheet.row_values(i)[0].strip()[:-2]
if re.match('[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}', str_date)!=None:
list_row.append(sheet.row_values(i))
print u'正在排序……'
list_row=sorted(list_row,key=self.getDatetime)# 将list_row排序,排序是对key进行比较,key指定的函数会作用于list中的每一个元素
return list_row
def process(self,list_rowValues,N):# list_rowValues: 存放所有row_value的list
N: 间隔N天内是existing
# 遍历每一行
for row_value in list_rowValues:
print u'正在处理第'+str(line)+u'行'
dt_current=self.getDatetime(row_value)# 订单日期时间的datetime类型
mber_id=row_value[1].strip()# 客户id
# 维护一个dict,用一个dict保存,客户id作为key,[当前第几次,上次订单日期时间]作为value
# 并且依此写入新数据到EXcel
if mber_id in self.dict_mid_data: # 如果存在这个key,说明该顾客之前有订单记录,更新dict,同时插入新数据到row_value
self.dict_mid_data[mber_id][0]+=1# 更新下单次数+1
row_value[3]=self.dict_mid_data[mber_id][0]# 插入下单次数
dt_last=self.dict_mid_data[mber_id][1]
row_value[4]=dt_last.strftime("%Y-%m-%d %H:%M:%S")# 插入上次订单日期时间
dis=abs(dt_current-dt_last)# 时间差的绝对值
row_value[5]=str(dis)# 插入与上次订单时间的间隔时间差
# 插入usertype
if dis &= datetime.timedelta(days=N):# 如果间隔在N天内
row_value[6]='existing'
row_value[6]='new'
if dt_current&dt_last:# 如果当前时间更近,更新dict里的上次日期时间
self.dict_mid_data[mber_id][1]=dt_current
else:# 不存在这个key,直接保存初始值
self.dict_mid_data[mber_id]=[1,dt_current]
row_value[3]=1 # 当前是第几次订单
row_value[4]=u'首次下单' # 当前日期时间
row_value[5]='-' # 与上次订单间隔时间
row_value[6]='new' # usertype
return list_rowValues
# 写入Excel并保存
def write_t_xl(self,list_rowValues,xl_addr):
wb=xlsxwriter.Workbook(xl_addr)
sheet=wb.add_worksheet('sheet1')
# 写入标题
sheet.write(0,0,'order_dt')
sheet.write(0,1,'member_id')
sheet.write(0,2,'member_type')
sheet.write(0,3,'times')
sheet.write(0,4,'last_order_dt')
sheet.write(0,5,'interval')
sheet.write(0,6,'user_type')
# 写入处理后的数据
len_list=len(list_rowValues)
for i in range(len_list):
print u'正在写入第'+str(i+1)+u'行……'
row_value=list_rowValues[i]
len_row=len(row_value)
for j in range(len_row):
sheet.write(i+1,j,row_value[j])
wb.close()
print u'写入完毕,excel文件已生成!'
l=['../excel/buyer_day.xlsx']#需要输入处理的文件路径list,即可以输入多个文件进行处理 buyerManager=BuyerManager() list_rowValues=buyerManager.getList_sorted(l) list_rowValues_new=buyerManager.process(list_rowValues, 100) buyerManager.write_t_xl(list_rowValues, '../excel/buyer_day_new.xlsx')结果展示图5.作业结果展示参考python高手之路python处理excel文件(方法汇总)python模块之XlsxWriter源码及作业练习文件ExcelOP_py
(来源:,如对本网转载内容、版权有异议,请联系我们: )
安卓网官方微信
微信号 Hiapk2013
这里有最无节操的小编和最鲜辣的资讯!
手机扫描二维码访问用Python读取excel中的数据
python中要想处理excel,必须用到第三方模块xlrd,所以windows
我安装方法是cmd中命令:E:\ANZHUANG\Python\Scripts&easy_install xlrd
(路径必须在的scripts下和必须安装easy_install)
#coding=utf-8
import xlrd
def print_xls(path):
data=xlrd.open_workbook(path) #打开excel
table=data.sheets()[1]
#打开的第几个sheet
nrows=table.nrows #捕获到有效数据的行数
range(nrows):
ss=table.row_values(i) #获取一行的所有值,每一列的值以列表项存在
range(len(ss)):
print ss[i] #输出一行中各个列的值
print '+++++++++++++++++++'
if __name__=='__main__':
print_xls('D:\\文档)
#coding=utf-8
import xlrd
def print_xls(path):
data=xlrd.open_workbook(path) #打开excel
table=data.sheets()[1]
#打开的第几个sheet
nrows=table.nrows #捕获到有效数据的行数
range(nrows):
ss=table.row_values(i) #获取一行的所有值,每一列的值以列表项存在
range(len(ss)):
print ss[i] #输出一行中各个列的值
print '+++++++++++++++++++'
if __name__=='__main__':
print_xls('D:\\文档\\.xls')
内的内容格式如下:
黄钊 男 医学院 预防医学 经金学院 经济学类
宋马小薇 女 医学院 预防医学 医学院 临床医学
杨婵媛 女 医学院 制药工程 医学院 口腔医学
祖丽皮亚 女 医学院 制药工程 医学院 临床医学
周力波 男 医学院 制药工程 医学院 临床医学
输出结果:
+++++++++++++++++++
+++++++++++++++++++
+++++++++++++++++++
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。订阅你的位置: >
> 【整理】Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据
背景Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据。 折腾过程1.找到了参考资料:其实是没有直接实现:打开已有的excel文件,然后在文件最后写入,添加新数据的函数的。只不过,可以利用:中的库,组合实现。2. 给出了示例代码:rom xlutils.copy import copy # http://pypi.python.org/pypi/xlutils
from xlrd import open_workbook # http://pypi.python.org/pypi/xlrd
from xlwt import easyxf # http://pypi.python.org/pypi/xlwt
START_ROW = 297 # 0 based (subtract 1 from excel row number)
col_age_november = 1
col_summer1 = 2
col_fall1 = 3
rb = open_workbook(file_path,formatting_info=True)
r_sheet = rb.sheet_by_index(0) # read only copy to introspect the file
wb = copy(rb) # a writable copy (I can't read values out of this, only write to it)
w_sheet = wb.get_sheet(0) # the sheet to write to within the writable copy
for row_index in range(START_ROW, r_sheet.nrows):
age_nov = r_sheet.cell(row_index, col_age_november).value
if age_nov == 3:
#If 3, then Combo I 3-4 year old
for both summer1 and fall1
w_sheet.write(row_index, col_summer1, 'Combo I 3-4 year old')
w_sheet.write(row_index, col_fall1, 'Combo I 3-4 year old')
wb.save(file_path + '.out' + os.path.splitext(file_path)[-1])3. 刚又看到,有更简洁的代码:from xlutils.copy import copy
w = copy('book1.xls')
w.get_sheet(0).write(0,0,&foo&)
w.save('book2.xls')4.现在打算去试试。先去安装xlrd:6.再去安装xlutils:7.接着可以去写代码了。8.先是:9.后是:10.后来是用如下代码:
from xlutils.
#init xls file
#styleBlueBkg= xlwt.easyxf('pattern: pattern solid, fore_colour sky_');
#styleBold
= xlwt.easyxf('font: bold on');
styleBoldRed
= xlwt.easyxf('font: color-index red, bold on');
headerStyle = styleBoldR
wb = xlwt.Workbook();
ws = wb.add_sheet(gConst['xls']['sheetName']);
ws.write(0, 0, &Header&,
headerStyle);
ws.write(0, 1, &CatalogNumber&, headerStyle);
ws.write(0, 2, &PartNumber&,
headerStyle);
wb.save(gConst['xls']['fileName']);
#open existed xls file
#newWb = xlutils.copy(gConst['xls']['fileName']);
#newWb = copy(gConst['xls']['fileName']);
oldWb = xlrd.open_workbook(gConst['xls']['fileName']);
print oldWb; #&xlrd.book.Book object at 0xC940&
newWb = copy(oldWb);
print newWb; #&xlwt.Workbook.Workbook object at 0xF470&
newWs = newWb.get_sheet(0);
newWs.write(1, 0, &value1&);
newWs.write(1, 1, &value2&);
newWs.write(1, 2, &value3&);
print &write new values ok&;
newWb.save(gConst['xls']['fileName']);
print &save with same name ok&; 实现了,打开,刚刚保存的,已经存在的xls文件,然后写入新数据的目的。但是有个缺点,第一次保存时的,带格式(标题内容为红色粗体)的内容:重新写入新数据,再保存时,却丢失了之前的格式(标题没了红色粗体了):11.后来还是参考:中的那个标准答案,在用xlrd.open_workbook时,添加对应的参数formatting_info=True,就可以保留原有格式了。完整代码:
from xlutils.
#init xls file
#styleBlueBkg= xlwt.easyxf('pattern: pattern solid, fore_colour sky_');
#styleBold
= xlwt.easyxf('font: bold on');
styleBoldRed
= xlwt.easyxf('font: color-index red, bold on');
headerStyle = styleBoldR
wb = xlwt.Workbook();
ws = wb.add_sheet(gConst['xls']['sheetName']);
ws.write(0, 0, &Header&,
headerStyle);
ws.write(0, 1, &CatalogNumber&, headerStyle);
ws.write(0, 2, &PartNumber&,
headerStyle);
wb.save(gConst['xls']['fileName']);
#open existed xls file
#newWb = xlutils.copy(gConst['xls']['fileName']);
#newWb = copy(gConst['xls']['fileName']);
oldWb = xlrd.open_workbook(gConst['xls']['fileName'], formatting_info=True);
print oldWb; #&xlrd.book.Book object at 0xC940&
newWb = copy(oldWb);
print newWb; #&xlwt.Workbook.Workbook object at 0xF470&
newWs = newWb.get_sheet(0);
newWs.write(1, 0, &value1&);
newWs.write(1, 1, &value2&);
newWs.write(1, 2, &value3&);
print &write new values ok&;
newWb.save(gConst['xls']['fileName']);
print &save with same name ok&; 最后重新写入的数据,就可以保留之前的格式了(标题为红色粗体): 总结python中操作,本身就复杂的xls文件,还是有点小麻烦的。想要,往已经存在的xls文件中,写入新的行,新的数据,对应的逻辑为:用xlrd.open_workbook打开已有的xsl文件注意添加参数formatting_info=True,得以保存之前数据的格式然后用,from xlutils.,之后的copy去从打开的xlrd的Book变量中,拷贝出一份,成为新的xlwt的Workbook变量然后对于xlwt的Workbook变量,就是正常的:通过get_sheet去获得对应的sheet拿到sheet变量后,就可以往sheet中,写入新的数据写完新数据后,最终save保存 相关完整代码为:
from xlutils.
styleBoldRed
= xlwt.easyxf('font: color-index red, bold on');
headerStyle = styleBoldR
wb = xlwt.Workbook();
ws = wb.add_sheet(gConst['xls']['sheetName']);
ws.write(0, 0, &Header&,
headerStyle);
ws.write(0, 1, &CatalogNumber&, headerStyle);
ws.write(0, 2, &PartNumber&,
headerStyle);
wb.save(gConst['xls']['fileName']);
#open existed xls file
#newWb = xlutils.copy(gConst['xls']['fileName']);
#newWb = copy(gConst['xls']['fileName']);
oldWb = xlrd.open_workbook(gConst['xls']['fileName'], formatting_info=True);
print oldWb; #&xlrd.book.Book object at 0xC940&
newWb = copy(oldWb);
print newWb; #&xlwt.Workbook.Workbook object at 0xF470&
newWs = newWb.get_sheet(0);
newWs.write(1, 0, &value1&);
newWs.write(1, 1, &value2&);
newWs.write(1, 2, &value3&);
print &write new values ok&;
newWb.save(gConst['xls']['fileName']);
print &save with same name ok&; 其中,关于如何下载和安装对应的库,可参考:转载请注明: & 与本文相关的文章
62 queries in 0.549 seconds, using 12.82MB memory本周热门月度阅读
本站仅为用户提供信息存储空间服务及链接、搜索服务,所有资源信息均未作修改,不对其真实性、合法性负责。
如有涉嫌侵权或违法违规内容,请,以便及时处理。

我要回帖

更多关于 python 读取excel 的文章

 

随机推荐