Dayday up ---- python Day5
模块
1、定义
模块: 用来从逻辑上组织python代码(变量,函数,类等,逻辑:实现一个功能),本质就是.py结尾的python文件(比如,文件名:test.py 对应的模块名: test)
包: 用来从逻辑上组织模块的,本质就是一个文件夹或者目录,包内必须带有一个__init__.py文件)
2、导入方法
import module_name
1 def_import.py 2 3 def test(): 4 '''test func''' 5 print("this is a test") 6 7 import.py 8 9 import def_import 10 11 def_import.test()
from module_name import def_name/other
1 from def_import import test 2 3 #def_import.test1() 不能使用这种方式 4 test() 5 6 from def_import import test as test1 # as设置别名 7 8 test1() 9 10 11 # from module_name import * 慎用导入文件的所有代码,因为python是逐行运行,如果主程序有同名的函数或变量,就会冲突,运行结果是主程序的函数结果
导入多个模块或者模块中的函数或变量 用逗号分隔
调用函数: test()
使用变量: test
导入包:
a、import package_test 导入包和导入模块不一样
b、在package_test 包下的__init__.py 文件需要写 from . import test1 #test1为模块名
c、使用,package_test.test1.test()
1 test.py 2 def test1(): 3 '''test1''' 4 print("this is a test") 5 6 __init__.py 7 from . import test 8 9 10 11 import.py 12 13 from package_test import test 14 test.test1() 15 16 import package_test 17 package_test.test.test1()
3、import本质(路径搜索和搜索路径)
导入模块的本质就是把python文件解释一遍
os.path.abspath(__file__) 搜索当前路径
导入包的本质就是解释执行该包下面的__init__.py文件
4、导入优化
例如:
优化前:
import def_import
def logger():
def_import.test() #每次导入都得重新搜索路径然后调用
print("in the logger")
def search():
def_import.test()
print("in the search")
logger()
search()
优化后:
from def_import import test #只需搜索一次,之后只需调用
def logger():
test()
print("in the logger")
def search():
test()
print("in the search")
logger()
search()
5、模块的分类
c、 元组方式
>>> time.localtime() time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=7, tm_min=6, tm_sec =55, tm_wday=2, tm_yday=237, tm_isdst=0)
时区:1、UTC 世界协调时,天文时间
2、UTC+8 中国时间
3、DST 夏令时
time模块的常用方法
time.time() 时间戳,秒为单位
>>> time.time() 1471994084.769
time.timezone UTC时区和本地的标准时差,单位为秒(s)
>>> time.timezone -28800 # 28800/3600 = 8h
time.altzone UTC时区和夏令时的标准时差, 单位为秒(s)
time.daylight 夏令时
time.sleep(2) 等待2s,单位为 s
time.gmtime() 元组格式的UTC标准世界时间
>>> time.gmtime() #括号里面为空,打印当前的UTC世界标准时间 time.struct_time(tm_year=2016, tm_mon=8, tm_mday=23, tm_hour=23, tm_min=23, tm_s ec=41, tm_wday=1, tm_yday=236, tm_isdst=0) >>> time.gmtime(123456789) #将括号里面的时间戳格式转换为元组格式的时间 time.struct_time(tm_year=1973, tm_mon=11, tm_mday=29, tm_hour=21, tm_min=33, tm_ sec=9, tm_wday=3, tm_yday=333, tm_isdst=0)
time.localtime() 元组格式的本地时间
>>> time.localtime() #括号为空,打印格式为元组的当前时间 time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=7, tm_min=26, tm_se c=46, tm_wday=2, tm_yday=237, tm_isdst=0) >>> time.localtime(1234567890) #将括号里面的时间戳转换为元组格式的时间 time.struct_time(tm_year=2009, tm_mon=2, tm_mday=14, tm_hour=7, tm_min=31, tm_se c=30, tm_wday=5, tm_yday=45, tm_isdst=0)
元组格式读取单个数据
>>> time.localtime() time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=10, tm_min=12, tm_s ec=32, tm_wday=2, tm_yday=237, tm_isdst=0) >>> x=time.localtime() >>> x.tm_year 2016 >>> x.tm_hour 10 >>> x.tm_min 12
time.mktime('元组格式') 元组转换成时间戳(s)
>>> t=(2009, 2, 17, 17, 3, 38, 1, 48, 0) >>> time.mktime(t) 1234861418.0 >>> t=(2016,8,24,10,23 >>> time.mktime((2009, 2, 17, 17, 3, 38, 1, 48, 0)) 1234861418.0
time.strftime('时间格式',时间元组) 元组转换成格式化的字符串
>>> t
(2009, 2, 17, 17, 3, 38, 1, 48, 0)
>>> time.strftime("%Y-%m-%d %H:%M:%S",t)
'2009-02-17 17:03:38'
>>>
time.strptime("格式化的字符串","时间格式") 格式化的字符串转换为元组
>>> time.strptime("2016-08-24 10:32:31","%Y-%m-%d %H:%M:%S") time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=10, tm_min=32, tm_s ec=31, tm_wday=2, tm_yday=237, tm_isdst=-1) 时间格式交换位置试试看? >>> time.strptime("2016-08-24 10:32:31","%Y-%H-%d %m:%M:%S") time.struct_time(tm_year=2016, tm_mon=10, tm_mday=24, tm_hour=8, tm_min=32, tm_s ec=31, tm_wday=0, tm_yday=298, tm_isdst=-1) >>>
time.asctime() 元组格式转换为字符串的格式
>>> time.asctime() 'Wed Aug 24 10:45:46 2016' >>> time.asctime(t) 'Tue Feb 17 17:03:38 2009'
time.ctime() 时间戳转换为字符串的格式
>>> time.time() 1472006831.455258 >>> time.ctime(1472006831.455258) 'Wed Aug 24 10:47:11 2016' >>> time.ctime() 'Wed Aug 24 10:47:31 2016' >>>
datetime
datetime.datetime.now() 获取当前时间
>>> datetime.datetime.now() datetime.datetime(2016, 8, 24, 10, 49, 10, 254053) >>>
datetime.datetime.now() + datetime.timedelta(n) 获取以今天时间为准的前后n天
>>> datetime.datetime.now() + datetime.timedelta(3) # 三天后的时间 datetime.datetime(2016, 8, 27, 10, 49, 43, 769970) >>> datetime.datetime.now() + datetime.timedelta(-3) # 三天前的时间 datetime.datetime(2016, 8, 21, 10, 52, 54, 919903) >>> datetime.datetime.now() + datetime.timedelta(hours=3) #3个小时后 datetime.datetime(2016, 8, 24, 13, 55, 25, 825534) >>> datetime.datetime.now() + datetime.timedelta(hours=-3) #三个小时前 datetime.datetime(2016, 8, 24, 7, 55, 36, 218128) >>> datetime.datetime.now() + datetime.timedelta(minutes=30) #30分钟后 datetime.datetime(2016, 8, 24, 11, 26, 0, 67492)
时间替换
>>> datetime.datetime.now() datetime.datetime(2016, 8, 24, 11, 0, 51, 781178) >>> c_time = datetime.datetime.now() >>> print(c_time.replace(minute=3,hour=2)) 2016-08-24 02:03:53.533278 >>>
时间格式
%a 本地(locale)简化星期名称 %A 本地完整星期名称 %b 本地简化月份名称 %B 本地完整月份名称 %c 本地相应的日期和时间表示 %d 一个月中的第几天(01 - 31) %H 一天中的第几个小时(24小时制,00 - 23) %I 第几个小时(12小时制,01 - 12) %j 一年中的第几天(001 - 366) %m 月份(01 - 12) %M 分钟数(00 - 59) %p 本地am或者pm的相应符 一 %S 秒(01 - 61) 二 %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 三 %w 一个星期中的第几天(0 - 6,0是星期天) 三 %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。 %x 本地相应日期 %X 本地相应时间 %y 去掉世纪的年份(00 - 99) %Y 完整的年份 %Z 时区的名字(如果不存在为空字符) %% ‘%’字符

2) random 模块 随机数
random.random() 默认是0~1 之间的浮点数
>>> random.random() 0.1017245616306045 >>>
random.randint(1,3) 1~3 整数包含1,3
>>> random.randint(1,3) 1 >>> random.randint(1,3) 2 >>> random.randint(1,3) 3
random.randrange(1,3) 1~3整数,顾头不顾尾 不包含3
>>> random.randrange(1,3) 1 >>> random.randrange(1,3) 2
random.choice('hello') 随机取字符串中的一个字符,可以传入序列,字符串,列表,元组
>>> random.choice('hello')
'e'
random.sample('hello',2) 从前面的序列中取2位
>>> random.sample('hello',2)
['h', 'o']
>>> random.sample('hello',3)
['l', 'o', 'e']
>>>
random.uniform(1,3) 1~3的浮点数
>>> random.uniform(1,3) 1.312823512792006 >>> random.uniform(1,3) 2.9976125317251823
random.shuffle() 把顺序打乱
#洗牌 >>> l = [1,2,3,4,5,6,7] >>> random.shuffle(l) >>> l [6, 4, 3, 7, 2, 5, 1]
随机验证码生成
#数字验证码 import random checkcode = "" for i in range(4): current=random.randint(1,9) checkcode += str(current) print(checkcode) #数字加字母验证码 import random checkcode = "" for i in range(4): current=random.randrange(0,4) if current == i: tmp = chr(random.randint(65,90)) else: tmp = random.randint(0,9) checkcode +=str(tmp) print(checkcode)
3) os 模块
os.getcwd() 获取当前目录
>>> import os >>> os.getcwd() 'C:\\Users\\Administrator' >>>
os.chdir('dirname') 切换到dirname 目录
>>> os.getcwd() 'D:\\' >>> os.chdir('C:\\Users\\Administrator') >>> os.getcwd() 'C:\\Users\\Administrator' >>> os.chdir(r'c:\Users\Administrator') >>> os.getcwd() 'C:\\Users\\Administrator' >>>
os.curdir 返回当前目录:('.')
>>> os.curdir '.'
os.pardir 获取当前目录的父级目录的字符串名:('..')
>>> os.pardir '..'
os.makedirs() 相当于linux下的mkdir -p 递归创建目录
>>> os.chdir('D:')
>>> os.getcwd()
'D:\\'
>>> os.makedirs(r'D:\a\b\c')
os.removedirs() 清理空文件夹,若目录为空,则删除,并递归到上一级目录,若也为空,则删除,以此类推
>>> os.removedirs(r'D:\a\b\c') >>> os.chdir(r'D:\a\b\c' ... ) Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'D:\\a\\b\\c' >>>
os.mkdir() 创建单级目录
os.mkdir(r'D:\a')
os.rmdir() 只删除一级目录
os.rmdir(r'D:\a')
os.listdir('.') 列出目录和文件
>>> os.listdir(r'D:')
os.remove('filename') 删除一个文件
os.rename() 重命名
os.stat() 返回文件/目录信息
>>> os.stat('D:')
os.stat_result(st_mode=16895, st_ino=1407374883553285, st_dev=703504, st_nlink=1
, st_uid=0, st_gid=0, st_size=12288, st_atime=1472039493, st_mtime=1472039493, s
t_ctime=1426573789)
os.sep 输出操作系统特定的路径分隔符
windows: >>> os.sep '\\' linux: >>> import os >>> os.sep '/'
os.linesep 输出当前平台换行符
windows: >>> os.linesep '\r\n' >>> linux: >>> os.linesep '\n'
os.pathsep 当前平台文件路径分隔符
windows: >>> os.pathsep ';' linux: >>> os.pathsep ':'
os.environ 获取系统环境变量
os.name 输出字符串指示当前使用平台
windows: >>> os.name 'nt' linux: >>> os.name 'posix'
os.system("bash command") 运行系统命令,直接显示
os.path.abspath(path) 返回path规范化的绝对路径
>>> os.path.abspath('D:迅雷')
'D:\\迅雷'
>>>
os.path.split(path) 将path分割成目录和文件名二元组返回
>>> os.path.split(r'D:\a\b\aaa.txt')
('D:\\a\\b', 'aaa.txt')
>>>
os.path.dirname(path) 返回path的目录,其实就是os.path.split(path) 返回的第一个元素
>>> os.path.dirname(r'D:\a\b\aaa.txt') 'D:\\a\\b' >>>
os.path.basename(path) 返回path最后的文件名. 其实就是os.path.split(path) 返回的第二个元素
>>> os.path.basename(r'D:\a\b\aaa.txt') 'aaa.txt'
os.path.exists() 判断目录或文件是否存在
>>> os.path.exists('D:')
True
>>> os.path.exists(r'D:\b')
False
>>>
os.path.isabs(path) 如果path 为绝对路径,返回True
>>> os.path.isabs(r'D:\b') True >>> os.path.isabs(r'.a') False >>>
os.path.isfile(path) 判断path是否是一个存在的文件,如果是返回True,否则返回False
>>> os.path.isfile(r'D:\a\b') False >>> os.path.isfile(r'D:\a\b\aaa.txt') True >>>
os.path.isdir(path) 判断path 是否是一个存在的目录,如果是返回True,否则返回False
>>> os.path.isdir(r'D:\a') True >>> os.path.isdir(r'D:\b') False >>>
os.path.join() 拼接路径
>>> os.path.join('/root','mysql','db')
'/root/mysql/db'
>>>
os.path.getatime(path) 返回文件或目录最后存取时间
>>> os.path.getatime(r'D:\a\b\aaa.txt') 1472040372.0026677
os.path.getmtime(path) 返回文件或目录最后修改时间
>>> os.path.getmtime(r'D:\a\b\aaa.txt') 1472040372.0026677
3) sys 模块
sys.argv 命令行参数list , 第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取 python 解释程序的版本信息
>>> sys.version '3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]'
sys.maxint 最大的int 的值,python3里面已经没有这个方法,python2里面有
python2 >>> import sys >>> sys.maxint 9223372036854775807 >>>
sys.path 返回模块的搜索路径,初始化时使用PATHPATH环境变量的值
>>> sys.path ['', 'D:\\python3.5.1\\lib\\site-packages\\pip-8.1.1-py3.5.egg', 'D:\\python3.5. 1\\python35.zip', 'D:\\python3.5.1\\DLLs', 'D:\\python3.5.1\\lib', 'D:\\python3. 5.1', 'D:\\python3.5.1\\lib\\site-packages'] >>>
sys.platform 返回操作系统平台名称
>>> sys.platform 'win32' >>>
sys.stdout.write('please:') 打印please: 字符串以及字符串的个数
>>> sys.stdout.write('please:')
please:7
sys.stdin.readline()[:-1]
>>> val = sys.stdin.readline()[:-1] sdf >>> print(val) sdf >>>
4) shutil 模块 进行文件的copy
shutil.copyfileobj(file1,file2) 将文件内容拷贝到另一个文件中,可以部分内容
import shutil
f1 = open("test","r")
f2 = open("test1","w")
shutil.copyfileobj(f1,f2)
f1.close()
f2.close()
shutil.copyfile(src,dst) copy文件
shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变
shutil.copystat(src, dst) 拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copy(src, dst) 拷贝文件和权限
shutil.copy2(src, dst) 拷贝文件和状态信息
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件
shutil.rmtree(path[, ignore_errors[, onerror]]) 递归的去删除文件
shutil.move(src, dst) 递归的去移动文件
shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如:www =>保存至当前路径
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
#将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
#将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录
import shutil
ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的
5) shelve 模块
是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
import shelve
d = shelve.open('shelve_test') #文件不能提前存在
info = {'age': 22,"job": 'it'} #定义要持久化的数据
d["info"] = info #写入数据
# print(d.get("info")) #获取数据
d.close()
写入文件之后的文件存在形式
6) xml 处理模块
xml文件
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
遍历xml
# -*- coding:utf-8 -*-
import xml.etree.ElementTree as ET #导入xml模块,并且设置别名为as
tree = ET.parse("test.xml")
root = tree.getroot() #获取xml第一层
print(root.tag)
#遍历xml文档
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag,i.text)
#只遍历year节点
for node in root.iter('year'):
print(node.tag,node.text)
修改和删除
#修改xml
for node in root.iter('year'):
new_year = int(node.text) + 1 #在原来的年份上加1年
node.text = str(new_year)
node.set("updated","yes") #在节点上面加上,作为属性
tree.write("test.xml")
# 删除 node
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write("test.xml")

浙公网安备 33010602011771号