设为首页 收藏本站
查看: 813|回复: 0

[经验分享] python学习与实战

[复制链接]

尚未签到

发表于 2017-4-25 11:56:17 | 显示全部楼层 |阅读模式
         恬好这几天有空,下去学习了python 脚本语言,给我的感觉是:超级shell脚本语言.
         如果你已经有java/javascript语言基础,下去参考<python简明教程> ,估计三两天就可以熟识语法了.当然 python 还包含了许多的模块,包括 面向过程开发/面向对象开发/多线程/web开发/文件处理等等,这些相关模拟当然需要根据实际情况再进行深入学习了.
         根据不同的需求以及不同的情况,不同的公司对其有不同的用法.大的可以用其做一些服务端主程/管理后台/web开发,小的可以用其进行日常运维工具.
   
       关于python的语法学习就不多说了,可以根据下述这两个电子书进行自学,三五天快速阅读(记性不好的,可以中途多搞一下文档上面的例子)
          <python简明教程> http://sebug.net/paper/python/index.html
          <python 手册> http://man.chinaunix.net/develop/python/python2.3tut/tut
   
        通过两天的python语法学习,再加个小项目以加固对python的理解.
要求:替换文件夹中所有xls文件的内容 .
输入:文件夹路径/需替换的key&value
 



  • 技术预研

     python编辑 xls 文件,其中一种方式是通过xlrd/xlwt/xlutils.
       Python中一般使用xlrdexcel read)来读取Excel文件,使用xlwtexcel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读 取excel是不能对其进行操作的:xlrd.open_workbook()方法返回xlrd.Book类型,是只读的,不能对其进行操作。而 xlwt.Workbook()返回的xlwt.Workbook类型的save(filepath)方法可以保存excel文件。
  因此对于读取和生成Excel文件都非常容易处理,但是对于已经存在的Excel文件进行修改就比较麻烦了。不过,还有一个xlutils(依赖于xlrdxlwt)提供复制excel文件内容和修改文件的功能。其实际也只是在xlrd.Bookxlwt.Workbook之间建立了一个管道而已,如下图:
  
    DSC0000.jpg
  但如果要对一个文件进行编辑,这个就有点扯蛋了.按目前我的理解是:
        所谓的编辑 xls 文件,就是copy一个副本出来,并对副本进行业务编辑处理,处理结束后再进行另存为保存结果(又或者直接保存到原文件进行覆盖,而并非是直接编辑原文件. )
        另外,目前遇到个问题,且未能解决:这里copy出来的副本,没办法把原文件中所包含的脚本/图片等资源,也一并复制过来.因此这样的结果是:如果文件中包含有一张图片,这样编辑过后的结果文件里面是没有插图的.
     xlrd/xlwt/xlutils各模块,可以到官网下载本地进行安装 .



  • 下载
  下载地址:http://www.python-excel.org/
  官网地址:http://www.python-excel.org/
  文档地址:https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html
  文档pdf下载:http://www.simplistix.co.uk/presentations/python-excel.pdf



  • 安装
  1.linux体系:(其他各模块安装与 下述xlrd模块安装一样)

$> cd xlrd-0.7.1
$> python setup.py install
 



  • 操作

python操作excel除了读就是写。
xlrd (主要负责读取xls内容,不能更改内容 )
http://pypi.python.org/pypi/xlrd
 
导入
import xlrd
打开excel
file = xlrd.open_workbook('demo.xls')
   
查看文件中包含sheet的名称
file.sheet_names()
   
得到第一个工作表,或者通过索引顺序 或 工作表名称
sheet = file.sheets()[0]
sheet = file.sheet_by_index(0)
sheet = file.sheet_by_name(u'Sheet1')
   
获取行数和列数
nrows = sheet.nrows
ncols = sheet.ncols
   
循环行,得到索引的列表
for rownum in range(sheet.nrows):
print sheet.row_values(rownum)
   
获取整行和整列的值(数组)
sheet.row_values(i)
sheet.col_values(i)
   
单元格(索引获取)
cell_A1 = sheet.cell(0,0).value
cell_C4 = sheet.cell(2,3).value
   
分别使用行列索引
cell_A1 = sheet.row(0)[0].value
cell_A2 = sheet.col(1)[0].value
   
 
   
 
xlwt (主要负责写xls内容 )
http://pypi.python.org/pypi/xlrd
   
导入xlwt
import xlwt
   
新建一个excel文件
file = xlwt.Workbook() #注意这里的Workbook首字母是大写,无语吧
   
新建一个sheet
sheet = file.add_sheet('sheet name')
   
通过索引获取一个已存在的sheet
sheet = file.get_sheet('sheet name')
   
写入数据sheet.write(,,value)
sheet.write(0,0,'test')
   
如果对一个单元格重复操作,会引发
returns error:
# Exception: Attempt to overwrite cell:
# sheetname=u'sheet 1' rowx=0 colx=0
   
所以在打开时加cell_overwrite_ok=True解决
sheet = file.add_sheet('sheet name',cell_overwrite_ok=True)
   
保存文件
file.save('demo.xls')
 



  • 项目实战
要求:替换文件夹中所有xls文件的内容 .
输入:文件夹路径/需替换的key&value
 
  源码注释已经较为清晰了,可复制本地直接运行.另该脚本只是简单处理,只作功能实现,未对其他异常进行处理,如 文件夹中包含有 txt 等文件时的情况处理.

#!/usr/local/python
#filename:replaceFile.py
# -*- coding:utf-8 -*-
import os
import os.path
import xdrlib ,sys
import xlrd
import xlwt
import xlutils
from xlutils.copy import copy
#
# 方法:根据keyValue字典数据,对文件 ffile 进行内容替换处理
#
def parseFile(ffile,keyValue):
print "Begin parse file:",ffile
# 1 字符串替换需在同一编码下进行,保存的数据需以unicode编码保存字符串
#
#strobj.decode("cp936") -------->将s解码成unicode,参数指定的是s本来的编码方式。这个和unicode(s,encodename)是一样的。
#strobj.encode("utf-8")-------->将unicode编码成str对象,参数指定使用的编码方式
#
#
##formatting_info=True保存之前数据的格式,表示一并把样式也打开,以便下述进行copy时把样式也复制过去
wb = xlrd.open_workbook(ffile,formatting_info=True)
#这个太扯蛋了,所谓的编辑 xls 文件,就是copy一个复本出来,并对复本进行编辑过后,再进行另存为(或者直接保存到原文件进行覆盖).而没法直接编辑原文件.
#但这样的copy,却没法把原文件里面的脚本 / 图片 等一并拿出来,导致没法把这些资源转到目标文件中.
t_wb = copy(wb)
for sheetid in range(wb.nsheets):
sh = wb.sheet_by_index(sheetid)
for rownum in range(sh.nrows):
for colnum in range(sh.ncols):
cellvalue = sh.cell(rownum,colnum).value
try:
#从xls读取下来的字符串,有str unicode  两种编码串.因此需转换成同一编码(本demo是统一转成utf-8)再进行 find replace 操作.
cellvalue = getValue(cellvalue)
for keytemp,valuetemp in keyValue.items():
if isinstance(cellvalue,str) and cellvalue.find(keytemp) != -1:
cellvalue = cellvalue.replace(keytemp,valuetemp)
#写入数据时,str需转换成 unicode编码格式
t_wb.get_sheet(sheetid).write(rownum,colnum,unicode(cellvalue,"utf-8"))
except EOFError:
print "error"
except Exception,x:
print "数据类型转换失败.type:",type(value),",value:",value
print x
print "Fail parse file."
return
t_wb.save(ffile)
print "End parse file!\n\n"

def getValue(value):
if isinstance(value,unicode):
return value.encode("utf-8")
elif isinstance(value,int):
return float(value)
else:
return value

#程序从这里开始运行
if __name__== "__main__" :
#数据目录
dataDir = ""
#文件列表
fileArray = []
#替换字符串
keyValue = {}
dataDir = raw_input("Please input the datadir:")
while(True):
key = raw_input("Please input the key:")
value = raw_input("Please input the value:")
keyValue[key] = value
quit = raw_input("Please input 'quit' to quit,or other to continue:")
if quit == 'quit':
break
print "\n\n######## Message ########"
print "dataDir:",dataDir
print "keyValue",keyValue
print "\n\n#########################"
print "\n\n#########################"
print "Begin search the Dir of all file "
#parent 是指dataDir各层子目录
#dirnames 是指  parent 当层下的所有子目录
#filenames 是指 parent 当层下的所有文件
for parent,dirnames,filenames in os.walk(dataDir):
for filename in filenames:
fileArray.append(os.path.join(parent,filename))
print "There are",len(fileArray)," files.";
print "##########################\n\n"

for filename in fileArray:
parseFile(filename,keyValue)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369099-1-1.html 上篇帖子: python convert unicode string 下篇帖子: Python启动、停止脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表