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()
import

 

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是逐行运行,如果主程序有同名的函数或变量,就会冲突,运行结果是主程序的函数结果
from..import..

 

导入多个模块或者模块中的函数或变量 用逗号分隔

调用函数: 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、模块的分类

  1) 标准库,内置模块
  2)开源模块,第三方库
  3) 自定义模块
 
6、常用标准库,内置模块
 
   1)时间模块
  time
  分为三种类型的时间格式
  a、格式化的字符串时间格式,按照自己的格式来写
  比如 2016-08-24 07:04:01
  b、 时间戳 从1970年开始到至今的秒数(因为unix是从1970年开始的,所以从1970年开始计数)

    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")

 

 

 

 

 

  

 

  

 

  

 

  

  

  

  

  

 

  

  

  

  

  

  

  

 

  

  

  

 

 

 

  

  

  

 

  

  

 

 

  

  

  

 

posted @ 2016-08-25 17:22  a_monologue  阅读(104)  评论(0)    收藏  举报