Python 一大重要的功能,就是可处理大量数据,那分不开的即是使用Excel表格了,这里我做下学习之后的总结,望对我,及广大同仁们是一个帮助
Python处理Excel数据需要用到2个库:xlwt 和 xlrd。xlwt库负责将数据导入生成Excel表格文件,而 xlrd库则负责将Excel表格中的数据取出来。 xlrd 库读取Excel的数据也是轻轻松松,先来看下实现代码
原表格简要说明:

# coding = utf-8
# 将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的excel文件
import xlrd, xlwt
import os, sys # 按项目 导出到新的excel文件
def export_all_excel():
root_dir = '/Users/zhaojs/Downloads'
for root, dirs, files in os.walk(root_dir):
for file in files:
file_xls = os.path.join(root_dir, file)
if file_xls.endswith('.xls'):
wb = xlrd.open_workbook(file_xls)
# 获取列表
sheet = wb.sheet_by_index(0) # 创建写入文件
workbook = xlwt.Workbook(encoding="utf-8")
# 总行数
total_rows = sheet.nrows
# 总列数
total_cols = sheet.ncols
print("行数 : %d 列数 : %d" % (total_rows, total_cols)) # 按项目简称小写 创建sheet 对象
worksheet = workbook.add_sheet('全部') new_data = [
['作业号', 'CPU/GPU', '项目', '场景文件', '渲染软件', '帧', '提交时间', '完成时间', '层名', '提交账户', '平台', '内存(GB)',
'余额消费(RMB)', '完成帧数',
'总帧数', '消耗时间(机时)', '实际消费(RMB)', '差值']
] loop_res = []
for i in range(10, total_rows - 1): # 去除最后一行总计
# 取出第i行 第 13 列的数据 平台名称
# platform_name = sheet.cell_value(i, 13) excel_filename = 'all_projects.xls'
outputs = sheet.row_values(i)
# 将列表内的值转成字符串
data = [str(z) for z in outputs]
if data == '\n':
pass
else:
tmp = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
# 作业号
tmp[0] = data[1]
# CPU/GPU || 实际消费
if data[13] == 'gpu':
tmp[1] = 'GPU'
sum_real_consumption = round(float(data[20]) * 4, 3)
tmp[16] = str(sum_real_consumption)
else:
tmp[1] = 'CPU'
sum_real_consumption = round(float(data[20]) * 1.3, 3)
tmp[16] = str(sum_real_consumption)
# 项目
tmp[2] = data[4][0:3]
# 场景文件
tmp[3] = data[4]
# 渲染软件
tmp[4] = data[5]
# 帧
tmp[5] = data[6]
# 提交时间
tmp[6] = data[7]
# 完成时间
tmp[7] = data[8]
# 层名
tmp[8] = data[10]
# 提交账户
tmp[9] = data[12]
# 平台
tmp[10] = data[13]
# 内存(GB)
tmp[11] = data[14]
# 余额消费(RMB)
tmp[12] = data[15]
# 完成帧数
tmp[13] = data[18]
# 总帧数
tmp[14] = data[19]
# 消耗时间(机时)
tmp[15] = data[20]
# 差值 计算差值 实际消费 - 余额消费
difference_value = 0 if (sum_real_consumption - float(data[15])) < 0 else int(
sum_real_consumption - float(data[15]))
tmp[17] = difference_value
loop_res.append(tmp)
# 形成带表头的列表集
new_data.append(tmp)
# 计算汇总数据
sum_prices = 0 # 总消费
sum_finish_frames = 0 # 总完成帧数
sum_frames = 0 # 总帧数之和
sum_times = 0 # 机时之和
sum_real_consumption = 0 # 实际消费
difference_value = 0 # 差值
z = 0
for res in loop_res:
# sys.exit()
sum_prices += float(res[12])
sum_finish_frames += int(float(res[13]))
sum_frames += int(float(res[14]))
sum_times += float(res[15])
sum_real_consumption += float(res[16])
difference_value += float(res[17])
z = z + 1 tmp_data = ['', '', '', '', '', '', '', '', '', '', '', '', round(sum_prices, 3), sum_finish_frames,
sum_frames,
round(sum_times, 3), sum_real_consumption, difference_value] # 合成最终列表
new_data.append(tmp_data) i = 0
for data in new_data:
for j in range(len(data)):
worksheet.write(i, j, data[j])
i = i + 1
workbook.save('./' + excel_filename) if __name__ == "__main__":
# Common_Excel().abc(123)
export_all_excel()
 

总结一下,分为一下几步:
  1. 首先通过xlrd库的open_workbook方法打开Excel文件(我这里的test.xls,是已存在数据的excel表格)
  2. 然后通过sheet_by_index方法获取表
  3. 然后分别获取表的行数和列数,便于后面循环遍历
  4. 根据列数和行数,循环遍历,根据某列单元格内的数据,即通过cell_value方法获取每个单元格中的数据,匹配到我手写的字符串,如符合,则取出该行所有数据,再次循环该行数据,将其写入到新的sheet中

工作表的相关操作

获取一个工作表,有多种方式

# 通过索引
sheet1 = wb.sheets()[0]
sheet1 = wb.sheet_by_index(0) # 通过名字
sheet1 = wb.sheet_by_name('test') # 获取所有表名sheet_names = wb.sheet_names()

获取某一行或某一列的所有数据

# 获取行中所有数据,返回结果是一个列表
tabs = sheet1.row_values(rowx=0, start_colx=0, end_colx=None)
# 返回一行一共有多少数据
len_value = sheet1.row_len(rowx=0)
row_values的三个参数分别是:行号、开始的列和结束的列,其中结束的列为None表示获取从开始列到最后的所有数据
类似的还有获取某一列的数据
 cols = sheet1.col_values(colx=0, start_rowx=0, end_rowx=None) 

处理时间数据

时间数据比较特殊,没发直接通过上面的cell_value方法获取。需要先转换为时间戳,然后再格式化成我们想要的格式。

比如要获取Excel表格中,格式为2019/8/13 20:46:35的时间数据

# 获取时间
time_value = sheet1.cell_value(3, 0) # 获取时间戳
time_stamp = int(xlrd.xldate.xldate_as_datetime(time_value, 0).timestamp())
print(time_stamp) # 格式化日期
time_rel = time.strftime("%Y/%m/%d", time.localtime(time_stamp))
print(time_rel)

基本也是三步走:

  1. 通过cell_value方法获取时间值
  2. 然后通过xldate_as_datetime方法获取时间戳
  3. 然后格式化一下

将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件的更多相关文章

  1. sqoop中,如果数据中本身有换行符,会导致数据错位

    sqoop中,如果数据中本身有换行符,会导致数据错位: 解决办法: 在sqoop import时修改配置文件 sudo -u hive sqoop import --connect jdbc:mysq ...

  2. mysql互换表中两列数据

    在开发过程中,有时由于业务等需要把一个表中的两列数据进行交换. 解决方案 使用update命令,这完全得益于MySQL SQL命令功能的强大支持. 表格中原来数据类似如下: select * from ...

  3. mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享

    原文地址:http://www.maomao365.com/?p=7335 摘要:    数据表中,有一列是自动流水号,由于各种操作异常原因(或者插入失败),此列数据会变的不连续,下文将讲述使用sql ...

  4. 对一个表中所有列数据模糊查询adoquery

    如何用adoquery对一个表中所有列进行模糊查询: procedure TForm3.Button4Click(Sender: TObject); var ASql,AKey: string; I: ...

  5. VBA Excel 对比两列数据

    Sub Md() ' ' Macro1 Macro ' 宏由 BX 录制,时间: 2012-6-8 ' 宏中的列数可以输入 A - IV 也可以输入 1-256 ' Dim i%, j%, i1%, ...

  6. Oracle、SQLServer 删除表中的重复数据,只保留一条记录

    原文地址: https://blog.csdn.net/yangwenxue_admin/article/details/51742426 https://www.cnblogs.com/spring ...

  7. 解决读取Excel表格中某列数据为空的问题 c#

    解决同一列中“字符串”和“数字”两种格式同时存在,读取时,不能正确显示“字符串”格式的问题:set xlsconn=CreateObject("ADODB.Connection") ...

  8. jQqery EasyUI dategrid行中多列数据的可编辑操作

    最近的项目中需要在前台dategrid列表中直接修改某些列的数据,并且修改后的数据需要不通过后台而自动更新在列表中. 带着这一问题开始寻找实现的思路,首先想到的就是去jQqery EasyUI官网找例 ...

  9. mysql互换表中两列数据方法

    1.创建表及记录用于测试 ) unsigned ) ,) unsigned ,) unsigned NOT NULL COMMENT '现价', PRIMARY KEY (`id`) ) ENGINE ...

随机推荐

  1. 动态规划_Cow Bowling_POJ-3176

    The cows don't use actual bowling balls when they go bowling. They each take a number (in the range ...

  2. javascript基本特点,组成和应用

    JavaScript 是一种基于客户端浏览器.面向(基于)对象和事件驱动式的网页脚本语言. 1. 基于客户端浏览器:静态语言,跨平台: 2. 面向(基于)对象:本身是没有类class和对象这个概念,但 ...

  3. 二进制文件安装安装flannel

    二进制文件安装安装flannel overlay网络简介 覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题. 详细说来,覆盖网络是指建立在另一个网络上的网络.该网络中的结 ...

  4. 林大妈的JavaScript基础知识(三):JavaScript编程(3)原型

    在一般的编程语言中,我们使用继承来复用代码,做成良好的数据结构.而在JavaScript中,我们使用原型来实现以上的需求.由于JavaScript专注于对象而摒弃了类,我们要明白原型和继承的确是有差异 ...

  5. python redis连接 有序集合去重

    # -*- coding: utf-8 -*- import redisfrom constant import redis_ip, redis_db, redis_pw, logger, redis ...

  6. codeforces1088D_Ehab and another another xor problem交互题

    传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...

  7. Kubernetes Pod 驱逐详解

    原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...

  8. 洛谷 P3628 特别行动队

    洛谷题目页面传送门 题意见洛谷. 这题一看就是DP... 设\(dp_i\)表示前\(i\)个士兵的最大战斗力.显然,最终答案为\(dp_n\),DP边界为\(dp_0=0\),状态转移方程为\(dp ...

  9. 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...

  10. 曹工杂谈:Java 类加载还会死锁?这是什么情况?

    一.前言 今天事不是很多,正好在Java交流群里,看到一个比较有意思的问题,于是花了点时间研究了一下,这里做个简单的分享. 先贴一份测试代码,大家可以先猜测一下,执行结果会是怎样的: import j ...