python逐行读取txt写入excel_用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)...

前几天接到一个任务,从gerrit上通过ssh命令获取一些commit相关的数据到文本文档中,随后将这些数据存入Excel中。数据格式如下图所示

242119152819994.png

观察上图可知,存在文本文档中的数据符合一定的格式,通过python读取、正则表达式处理并写入Excel文档将大大减少人工处理的工作量。

1. 从gerrit获取原始信息,存入文本文档:

$ssh –p 29418 @192.168.1.16 gerrit query status:merged since: 2>&1 | tee merged_patch_this_week.txt

2. 从txt文档中读取数据。

Python的标准库中,文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。

readline() 和 readlines()之间的差异是后者一次读取整个文件,象 .read()一样。.readlines()自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for... in ... 结构进行处理。另一方面,.readline()每次只读取一行,通常比 .readlines()慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用.readline()。

patch_file_name="merged_patch_this_week.txt"patch_file=open(patch_file_name,'r') #打开文档,逐行读取数据

for line inopen(patch_file_name):

line=patch_file.readline()print line

3. 写入到Excel文档中

python处理Excel的函数库中,xlrd、xlwt、xlutils比较常用,网上关于它们的资料也有很多。但由于它们都不支持Excel 2007以后的版本(.xlsx),所以只能忍痛放弃。

经过一番搜索,找到了openpyxl这个函数库,它不仅支持Excel 2007,并且一直有人维护(当前最新版本为2.2.1,2015年3月31日发布)。官方的描述为:

A Python library to read/write Excel 2007 xlsx/xlsm files,它的文档清晰易读,相关网站:http://openpyxl.readthedocs.org/en/latest/index.html

安装方法(windows 7):首先安装jdcal模块--解压缩到某目录,cd到该目录,运行"python setup.py install"。 然后安装openpyxl,方法相同。

写入步骤如下:

1. 打开工作簿:

wb=load_workbook('Android_Patch_Review-Y2015.xlsx')

2. 获得工作表

sheetnames =wb.get_sheet_names()

ws= wb.get_sheet_by_name(sheetnames[2])

3. 将txt文档中的数据写入并设置单元格格式

patch_file_name="merged_patch_this_week.txt"patch_file=open(patch_file_name,'r') #打开文档,逐行读取数据

ft=Font(name='Neo Sans Intel',size=11)for line inopen(patch_file_name):

line=patch_file.readline()

ws.cell(row=1,column=6).value=re.sub('project:','',line)#匹配project行,若匹配成功,则将字符串“project:”删除,剩余部分写入Excel第1行第6列

ws.cell(row=rows+1,column=1).font=ft

4. 保存工作簿

wb.save('Android_Patch_Review-Y2015.xlsx')

完整代码如下:

from openpyxl.workbook importWorkbookfrom openpyxl.reader.excel importload_workbookfrom openpyxl.styles importPatternFill, Border, Side, Alignment, Protection, Fontimportre#from openpyxl.writer.excel import ExcelWriter#import xlrd

ft=Font(name='Neo Sans Intel',size=11) #define font style

bd=Border(left=Side(border_style='thin',color='00000000'),\

right=Side(border_style='thin',color='00000000'),\

top=Side(border_style='thin',color='00000000'),\

bottom=Side(border_style='thin',color='00000000')) #define border style

alg_cc=Alignment(horizontal='center',\

vertical='center',\

text_rotation=0,\

wrap_text=True,\

shrink_to_fit=True,\

indent=0) #define alignment styles

alg_cb=Alignment(horizontal='center',\

vertical='bottom',\

text_rotation=0,\

wrap_text=True,\

shrink_to_fit=True,\

indent=0)

alg_lc=Alignment(horizontal='left',\

vertical='center',\

text_rotation=0,\

wrap_text=True,\

shrink_to_fit=True,\

indent=0)

patch_file_name="merged_patch_this_week.txt"patch_file=open(patch_file_name,'r') #get data patch text

wb=load_workbook('Android_Patch_Review-Y2015.xlsx') #open excel to write

sheetnames =wb.get_sheet_names()

ws= wb.get_sheet_by_name(sheetnames[2]) #get sheet

rows=len(ws.rows)assert ws.cell(row=rows,column=1).value!=None, 'New Document or empty row at the end of the document? Please input at least one row!'

print "The original Excel document has %d rows totally." %(rows)

end_tag='type: stats'

for line inopen(patch_file_name):

line=patch_file.readline()if re.match(end_tag,line) is not None: #end string

break

if len(line)==1: #go to next patch

rows=rows+1

continueline=line.strip()#print line

ws.cell(row=rows+1,column=1).value=ws.cell(row=rows,column=1).value+1 #Write No.

ws.cell(row=rows+1,column=1).font=ft

ws.cell(row=rows+1,column=1).border=bd

ws.cell(row=rows+1,column=1).alignment=alg_cb

ws.cell(row=rows+1,column=5).border=bd

ws.cell(row=rows+1,column=9).border=bdif re.match('change',line) is notNone:

ws.cell(row=rows+1,column=2).value=re.sub('change','',line) #Write Gerrit ID

ws.cell(row=rows+1,column=2).font=ft

ws.cell(row=rows+1,column=2).border=bd

ws.cell(row=rows+1,column=2).alignment=alg_cbif re.match('url:',line) is notNone:

ws.cell(row=rows+1,column=3).value=re.sub('url:','',line) #Write Gerrit url

ws.cell(row=rows+1,column=3).font=ft

ws.cell(row=rows+1,column=3).border=bd

ws.cell(row=rows+1,column=3).alignment=alg_cbif re.match('project:',line) is notNone:

ws.cell(row=rows+1,column=6).value=re.sub('project:','',line) #Write project

ws.cell(row=rows+1,column=6).font=ft

ws.cell(row=rows+1,column=6).border=bd

ws.cell(row=rows+1,column=6).alignment=alg_lcif re.match('branch:',line) is notNone:

ws.cell(row=rows+1,column=7).value=re.sub('branch:','',line) #Write branch

ws.cell(row=rows+1,column=7).font=ft

ws.cell(row=rows+1,column=7).border=bd

ws.cell(row=rows+1,column=7).alignment=alg_ccif re.match('lastUpdated:',line) is notNone:

ws.cell(row=rows+1,column=8).value=re.sub('lastUpdated:|CST','',line) #Write update time

ws.cell(row=rows+1,column=8).font=ft

ws.cell(row=rows+1,column=8).border=bd

ws.cell(row=rows+1,column=8).alignment=alg_ccif re.match('commitMessage:',line) is notNone:

description_str=re.sub('commitMessage:','',line)if re.match('Product:|BugID:|Description:|Unit Test:|Change-Id:',line) is notNone:

description_str=description_str+'\n'+line # if re.match('Signed-off-by:',line) is notNone:

description_str=description_str+'\n'+line

ws.cell(row=rows+1,column=4).value=description_str #Write patch description

ws.cell(row=rows+1,column=4).font=ft

ws.cell(row=rows+1,column=4).border=bd

ws.cell(row=rows+1,column=4).alignment=alg_lc

wb.save('Android_Patch_Review-Y2015.xlsx')print 'Android_Patch_Review-Y2015.xlsx saved!\nPatch Collection Done!'

#patch_file.close()

目前为止,基本功能已经实现,但是还有两个问题没有搞明白:

第一个是完整代码中的最后一句注释行,我搜到的几篇介绍openpyxl的博客中,打开文件后都没有close,所以我在代码中也没有close。理论上感觉还是需要的。等对文件对象的理解更加深入一些时会继续考虑这个问题。

第二是运行该脚本时有一个warning," UserWarning: Discarded range with reserved name,warnings.warn("Discarded range with reserved name")“,目前还在搜索原因,如有明白的,也请不吝告知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Extjs 之 initComponent 和 constructor的区别(转)

在创建自定义类时,先构造(constructor)后初始化(initComponent)。如:(在旧的Extjs 版本中使用 Ext.extend 实现扩展) Ext.define(Btn,{ extend:Ext.button.Button, init…

hive遍历_从Hive中的stored as file_foramt看hive调优

一、行式数据库和列式数据库的对比1、存储比较行式数据库存储在hdfs上式按行进行存储的,一个block存储一或多行数据。而列式数据库在hdfs上则是按照列进行存储,一个block可能有一列或多列数据。2、压缩比较对于行式数据库,必然按行压缩&#…

帮助孩子学会感恩_页数204_出版日期2015.03_完整版PDF电子书下载

帮助孩子学会感恩_页数204_出版日期2015.03_完整版PDF电子书下载 带索引书签目录高清版_13813212 下载链接http://pan.baidu.com/s/1geEmUeZ 【作 者】(英)蒂姆惠特尼(TimWhitney)著【丛书名】陪孩子成长系列丛书【形态项】 204 …

xwpftablecell设置字体样式_HTML的文字样式

font 属性可以用来作为 font-style, font-variant, font-weight, font-size, line-height 和 font-family 属性的简写,或将元素的字体设置为系统字体。字体修改font-family 属性:设置HTML页面中的字体font-size 属性:设置字体大小font-weight…

15-CSS基础-浮动流

浮动 网页的布局方式 什么是网页的布局方式? 网页的布局方式其实就是指浏览器是如何对网页中的元素进行排版的 标准流(文档流/普通流)排版方式 其实浏览器默认的排版方式就是标准流的排版方式在CSS中将元素分为三类, 分别是块级元素/行内元素/行内块级元素在标准流中有两种排版…

git-- 使用

git 使用时两个人冲突: Resolve conflicts

高内聚低耦合通俗理解_抱歉,请不要把“业务逻辑层”理解为“业务中台”

在IAS2019中台架构峰会上,我曾与一位年轻帅气的技术小伙来了一番有趣的对话。因为和朋友有约,所以我在现场互动结束之后,就急匆匆地跟其他嘉宾打了声招呼,抱着笔记本冲出了会场。但没想到刚到电梯口,却被一位帅小伙迎面…

org-mode入门教程

org-mode 入门教程By Z.H. Fu切问录 www.fuzihao.orgorg-mode 入门教程 org-mode是Emacs提供的一个强大的编辑模式,可以用于做会议笔记以及制作各种待办事项(GDT)。其语法类似于Markdown但是提供了比Markdown更多的操作,再加上Ema…

如何对web.config进行加密和解密

http://blog.csdn.net/jf_jifei/article/details/6527390 在WEB网站开发过程中,如果我们将数据库连接字符串封装到.DLL文件中,将会给数据库和程序的迁移带来麻烦,因为万一服务器地址或者数据库发生变更,那么我们就不得不修改源程序…

java 爬虫_Java原生代码实现爬虫(爬取小说)

Java也能做爬虫。现在提到爬虫人第一个想到的就是python,其实使用Java编写爬虫也是很好的选择,Java成熟的爬虫框架很多,下面给大家展示一个使用Java基础语言编写的爬取小说的案例:实现功能:爬取目标网站全本小说代码编…

JS window对象 Location对象 location用于获取或设置窗体的URL,并且可以用于解析URL。 语法: location.[属性|方法]...

Location对象 location用于获取或设置窗体的URL&#xff0c;并且可以用于解析URL。 语法: location.[属性|方法] location对象属性图示: location 对象属性&#xff1a; location 对象方法: 任务 在右边编辑器script标签内&#xff0c;获取当前显示文档的URL,并输出。 <!DOC…

java 数据结构_Java版-数据结构-队列(数组队列)

前言看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友&#xff0c;都给予了笔者一致的好评&#xff0c;在这里笔者感谢大家的认可&#xff01;&#xff01;&#xff01;由于本章介绍的数据结构是 队列&#xff0c;在队列的实现上会基于前面写的 动态数组来实现&#xff0c…

ssh 介绍 和使用 程序不挂起

目录 SSH的安全机制 SSH的安装 启动服务器的SSH服务 SSH两种级别的远程登录 SSH的高级应用 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行…

java 四舍五入_Java常用类

每个人的心里&#xff0c;都藏着一个了不起的自己&#xff0c;只要你不颓废&#xff0c;不消极&#xff0c;一直悄悄酝酿着乐观&#xff0c;培养着豁达&#xff0c;坚持着善良&#xff0c;只要在路上&#xff0c;就没有到达不了的远方&#xff01;BigInteger在Java中&#xff0…

Sublime 插件- px 转rem

一个CSS的px值转rem值的Sublime Text 3自动完成插件。 插件效果如下&#xff1a; 安装 克隆项目 https://github.com/hyb628/cssrem.git进入packages目录&#xff1a;Sublime Text -> Preferences -> Browse Packages...复制下载的cssrem目录到刚才的packges目录里。重…

window8下安装RabbitMQ

2019独角兽企业重金招聘Python工程师标准>>> 1.下载并安装erlang&#xff0c;http://www.erlang.org/download.html。64位的下载的是otp_win64_19.1.exe 查看是否安装成功&#xff1a; 2.下载RabbitMQ,最新版是2.8.1&#xff0c;http://www.rabbitmq.com/releases/r…

gdb 收到SIGPIPE信号

2019独角兽企业重金招聘Python工程师标准>>> handle SIGPIPE noprint nostop 转载于:https://my.oschina.net/u/1176097/blog/761957

列的数目比列的名字要多_你们要的甘特图来啦!还有具体做法哦!

作为项目的负责人&#xff0c;“时间管理”也是极为重要的一环。甘特图作为常用的项目管理工具之一&#xff0c;有助于把一个大型项目划分为几个小部分&#xff0c;并有条理地展示。甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利劳伦斯甘特(Henry Laurenc…

图片处理拓展篇 : 图片转字符画(ascii)

首先要明确思路, 图片是由像素组成的, 不同的像素有不同的颜色(rgb), 那么既然我们要转化为字符画, 最直接的办法就是利用字符串来替代像素, 也就是用不同的字符串来代表不同的像素. 另外图片一般来讲是彩色的, 而acsii(一般打印在终端上吧) 都是黑白的, 此时就要介绍另外一个概…

未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说自定义函数的细节...

没有学不会的python函数是什么&#xff1f;老调常谈&#xff0c;还是那老一套&#xff0c;学习一个东西前&#xff0c;先搞懂是什么&#xff0c;再来学习怎么用。函数函数&#xff0c;如果你是刚经历过高考肯定很熟悉&#xff0c;数学中就经常出现这个名词&#xff0c;比如什么…