一。前言
小编其实学习python有一个多月了,感觉学着很痛苦,很吃力。所以,在工作中需要用的的脚本,全部应用paython去做,暂时摈弃了shell。
shell基础还不错,所以用python完全是按照shell那套思路去做的,以后慢慢改进。
python是面向对象的编程语言,能实现一些工作比shell来的简单。python支持很多库,这些库各自能实现很多功能,当需要用到什么功能的时候,就导入(import)这个库就行,这样放百年多了。
二。实例
背景:全备mysql数据库,并压缩
这个用shell实现起来很简单,一句mysqldump就行了,这次小编采取python来写,哈哈~慢慢提升自己的能力,在工作中学习才是最有效的。
代码如下:
-
#!/usr/local/bin/python
-
#NOTICE:if you want to add mysql database for bakup,please add parameter
-
# like "DBNAME001,db001_name,db001_dir,db001_file_name,db001_zip_name" ,and
-
# add parameter in "DBNAME,DB_FILE_NAME,DB_ZIP_NAME,DB_DIR"
-
#author:xiexintao
-
#time:2013-05-29
-
import os
-
import time
-
-
DBUSER = "root"
-
DBPASS = "123456"
-
DBIP = "localhost"
-
SOCKET = "/var/run/mysqld/mysqld.sock"
-
-
DBNAME001 = "log market people"
-
-
timeformat = "%Y%m%d%H%M"
-
nowtime = time.strftime(timeformat)
-
-
zip_dir = "/data/mysql_bakcup/all_backup"
-
db001_name = "log_market_people"
-
-
db001_dir = os.path.join(zip_dir,db001_name)
-
-
db001_file_name = "%s.sql.%s" % (db001_name,nowtime)
-
db001_zip_name = "%s/%s_%s.tar.bz2" % (db001_dir,db001_name,nowtime)
-
-
DBNAME = [DBNAME001,]
-
DB_FILE_NAME = [db001_file_name,]
-
DB_ZIP_NAME = [db001_zip_name,]
-
DB_DIR = [db001_dir,]
-
-
mysqldump = "mysqldump -u"%s" -p"%s" -S"%s" -h"%s" -B %s > "%s""
-
compress = "tar -jcf "%s" "%s""
-
-
for i in range(len(DBNAME)):
-
dump_result = mysqldump % (DBUSER,DBPASS,SOCKET,DBIP,DBNAME[i],DB_FILE_NAME[i])
-
compress_result = compress % (DB_ZIP_NAME[i],DB_FILE_NAME[i])
-
-
os.system("mkdir -p %s" % DB_DIR[i])
-
os.system(dump_result)
-
os.system(compress_result)
-
os.remove(DB_FILE_NAME[i])
基本思路:
利用mysqldump备份我所需的数据库后,将备份出来的sql打包压缩成tar.bz2,再将sql删掉
脚本详解:
python是基于模块的,你需要用到什么功能就需要到导入相应的模块,有些模块需要下载,有些模块这是安装python时自带了,建议大家python为2.7。
本脚本用到了两个模块os和time,所以脚本最开始就要导入这两个个模块:
import os
import time
本脚本需要用到的功能,调用系统命令,打印时间:
思路设计之初,利用mysqldump备份mysql库,然后用tar打包,文加名上加上当前时间,然后删除备份的sql文本。
这里调用系统命令,用到了os模块中的system模块:
system模块调用linux系统命令,例如我在linux命令行输入python进入python命令行:
#python
>>>import os
>>>os.system("ls") ##不加引号表示python中定义的变量或python内部命令
...这里会打印进入python之前目录下的文件和文件夹
>>>os.system("date")
...这里会打印当前时间
这里调用当前时间,并没有使用os.system("date")的格式,python中有time模块,用于打印时间相关,如果再去用os.system("date")就太不专业了。。。
time中strftime的模块,可以打印指定格式,脚本中使用如下:
time.strftime("%Y%m%d%H%M")
这样答应出来的格式%Y%m%d%H%M,同date命令,各位不防在python命令下import time,试一下
这里删除导出的sql文本用的是os模块下的remove模块,这个类似于命令行下的rm,不妨python命令行下一试:
#python
>>>import os
>>>os.system("touch /tmp/a") ###在tmp下创建a文件
>>>os.system("ls /tmp" ) ###查看/tmp目录下,有a文件
>>>os.remove("/tmp/a") ###删除/tmp下a文件
python变量定义:
本脚本中的变量(典型)如下:同shell很像,shell不能有空格,python建议各位用空格
DBUSER = "root"
DBPASS = "123456"
DBIP = "localhost"
SOCKET = "/var/run/mysqld/mysqld.sock"
DBNAME001 = "log_market_people"
timeformat = "%Y%m%d%H%M"
zip_dir = "/data/mysql_bakcup/all_backup"
db001_name = "log_market_people"
变量调用(典型举例):%d调用整型,%s调用字符串,同C语言很像的说
db001_file_name = "%s.sql.%s" % (db001_name,nowtime)
释义:第一个%s为调用db001_name的值,第二个%s为调用nowtime的值,这里要注意,因为我要调用的db001_name和nowtime都是变量
所以他们没有引号括起来,调用的格式如上所示,也可以是下面这种:
a = "%s" % ("god")
这样就将god赋值到a中了
db001_zip_name = "%s/%s_%s.tar.bz2" % (db001_dir,db001_name,nowtime)
同上释义
数组:
数组格式定义如下:
a = ["aaa","bbb","ccc"]
这样a[0]就是aaa,a[1]就是bbb,a[3]就是ccc,如是数组中更多的元素的一次类推。
(脚本中典型)
DBNAME = [DBNAME001,]
脚本中数据库名暂时只有一个,所有数组中只定义了一个。
for循环:
for循环基本格式:(注意以冒号分割,for循环内容需要向后缩进,python默认在一个缩进层的为同级别,若下面print i不缩进,则print i就不属于佛如循
环内部的内容。
for i in range(1,100):
print i
这里range(1,100)表示顺序取1到100的数
print i打印i值,这里i没加双引号,即打印变量i的值,若想打印i本身,应该这样:print ("i")
脚本典型:
for i in range(len(DBNAME)): ###这里range(len(DBNAME)),是为了让DBNAME[i],DB_FILE_NAME[i],DB_ZIP_NAME[i]在循环
###过程中i的值相同
dump_result = mysqldump % (DBUSER,DBPASS,SOCKET,DBIP,DBNAME[i],DB_FILE_NAME[i]) ###将mysqldump命令定义为一个变量
compress_result = compress % (DB_ZIP_NAME[i],DB_FILE_NAME[i]) ###压缩备份出来sql的命令定义为命令
os.system("mkdir -p %s" % DB_DIR[i]) ###创建目录,注意这里调用变量的方法
os.system(dump_result) ###使用之前定义好的命令来调用mysqldump
os.system(compress_result) ###使用之前定义好的命令来压缩打包
os.remove(DB_FILE_NAME[i]) ###删除临时的sql文本文件,只保存最后的sql压缩文件
三。总结
整个脚本中的用到python的知识点基本说道了,现在再重新去读一下这个脚本,一定豁然开朗,迅速进入pyton的学习,直接全看教程还是有些茫然,建议,直接从实战入手,学的很快~~~
阅读(2731) | 评论(1) | 转发(4) |