将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件
- 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()
- 总结一下,分为一下几步:
- 首先通过
xlrd
库的open_workbook
方法打开Excel文件(我这里的test.xls,是已存在数据的excel表格) - 然后通过
sheet_by_index
方法获取表 - 然后分别获取表的行数和列数,便于后面循环遍历
- 根据列数和行数,循环遍历,根据某列单元格内的数据,即通过
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)
基本也是三步走:
- 通过
cell_value
方法获取时间值 - 然后通过
xldate_as_datetime
方法获取时间戳 - 然后格式化一下
将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件的更多相关文章
- sqoop中,如果数据中本身有换行符,会导致数据错位
sqoop中,如果数据中本身有换行符,会导致数据错位: 解决办法: 在sqoop import时修改配置文件 sudo -u hive sqoop import --connect jdbc:mysq ...
- mysql互换表中两列数据
在开发过程中,有时由于业务等需要把一个表中的两列数据进行交换. 解决方案 使用update命令,这完全得益于MySQL SQL命令功能的强大支持. 表格中原来数据类似如下: select * from ...
- mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享
原文地址:http://www.maomao365.com/?p=7335 摘要: 数据表中,有一列是自动流水号,由于各种操作异常原因(或者插入失败),此列数据会变的不连续,下文将讲述使用sql ...
- 对一个表中所有列数据模糊查询adoquery
如何用adoquery对一个表中所有列进行模糊查询: procedure TForm3.Button4Click(Sender: TObject); var ASql,AKey: string; I: ...
- VBA Excel 对比两列数据
Sub Md() ' ' Macro1 Macro ' 宏由 BX 录制,时间: 2012-6-8 ' 宏中的列数可以输入 A - IV 也可以输入 1-256 ' Dim i%, j%, i1%, ...
- Oracle、SQLServer 删除表中的重复数据,只保留一条记录
原文地址: https://blog.csdn.net/yangwenxue_admin/article/details/51742426 https://www.cnblogs.com/spring ...
- 解决读取Excel表格中某列数据为空的问题 c#
解决同一列中“字符串”和“数字”两种格式同时存在,读取时,不能正确显示“字符串”格式的问题:set xlsconn=CreateObject("ADODB.Connection") ...
- jQqery EasyUI dategrid行中多列数据的可编辑操作
最近的项目中需要在前台dategrid列表中直接修改某些列的数据,并且修改后的数据需要不通过后台而自动更新在列表中. 带着这一问题开始寻找实现的思路,首先想到的就是去jQqery EasyUI官网找例 ...
- mysql互换表中两列数据方法
1.创建表及记录用于测试 ) unsigned ) ,) unsigned ,) unsigned NOT NULL COMMENT '现价', PRIMARY KEY (`id`) ) ENGINE ...
随机推荐
- 显示Mac隐藏文件的命令:
设置查看隐藏文件的方法如下:打开终端,输入命名 显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏 ...
- Git 学习笔记之(一) 使用 git gui 从github上下载代码
背景: 目前一些开源代码均在 GitHub上管理的,包括自己写的代码也可以放在上面进行管理.但问题是,当你换一台电脑,想要将你自己放在 GitHub 上的代码工程下载下来的时候,会遇到各种问题,目前可 ...
- 四、Python基础(1)
目录 四.Python基础(1) 四.Python基础(1) 1.什么是变量? 一种变化的量,量是记录世界上的状态,变指得是这些状态是会变化的. 2.为什么有变量? 因为计算机程序的运行就是一系列状态 ...
- 基于Spring注解的上下文初始化过程源码解析(二)
上一篇看完了register方法的代码,继续跟后面代码 后面执行refresh方法,代码清单如下: public void refresh() throws BeansException, Illeg ...
- 自定义仿 IPhone 开关控件
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- Linux 常用命令及详解
1. type :查询命令 是否属于shell解释器2. help : 帮助命令3. man : 为所有用户提供在线帮助4. ls : 列表显示目录内的文件及目录-l 以长格式显 ...
- 48.QT-网络通信讲解1
网络概念 MAC地址(硬件地址) 网络IP地址(如192.168.1.101) 网络端口(实现多路通信,用来给不同应用程序来区分使用,范围0~65535,比如浏览网页服务(80端口), FTP服务(2 ...
- Winform DataGridView 取消默认选中行
困境 网上有很多解决方法,可是很多读者照做并不生效.追究其原因,问题出现在许多博主没有搞清楚DataGridView绑定与当前触发事件的关系. 复现 private void Frm_Load(obj ...
- hadoop安装解决之道
# 壹.故障现象 ```xml Microsoft Windows [版本 10.0.18362.239] (c) 2019 Microsoft Corporation.保留所有权利. C:\User ...
- python 列表的增删改查
列表 有序可变的,索引 作用:存储数据的,支持很多种数据类型 定义方式: lst = [1,"alex",True,('a','b')]增 append() # 追加 extend ...