Python--常用模块

2018-12-03 09:26:41来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

random 模块

随机:在某个范围内取到每一个值的概率是相同的

import random
# 随机小数
print(random.random())          # 0-1之内的随机小数
print(random.uniform(1, 5))     # 任意范围之内的随机小数


# 随机整数
print(random.randint(1, 2))     # [1,2] 包含2在内的范围内随机取整数
print(random.randrange(1, 2))   # [1,2) 不包含2在内的范围内随机取整数
print(random.randrange(1, 10, 2))   # [1,10) 不包含10在内的范围内随机取奇数


# 随机抽取
lst = [1, 2, 3, 'abc', ('wahaha', 'qqxing')]
ret = random.choice(lst)      # 随机抽取一个值
print(ret)

ret1 = random.sample(lst, 2)    # 随机抽取两个值
print(ret1)


# 打乱顺序  在原列表的基础上做乱序
lst = [1, 2, 3, 'abc', ('wahaha', 'qqxing')]
random.shuffle(lst)
print(lst)

练习:生成随机验证码

# (1)4位数字的验证码
# 基础版本
lis = ''
for i in range(4):
    num = random.randint(0, 9)
    lis += str(num)
print(lis)

# 函数版本
def rand_code(n=4):
    lis = ''
    for i in range(n):
        num = random.randint(0, 9)
        lis += str(num)
    return lis
print(rand_code(6))


# (2)6位 数字+字母
def rand_code(n):
    code = ''
    for i in range(n):
        rand_num = str(random.randint(0, 9))
        rand_alph = chr(random.randint(97, 122))
        rand_alph_upper = chr(random.randint(65, 90))
        rand_num = random.choice([rand_num, rand_alph, rand_alph_upper])
        code += rand_num
    return code
ret = rand_code(4)
print(ret)


# (3)可控制验证码  数字 / 数字+字母
def rand_code(num, DefaultAlph=True):   # 当DefaultAlph=True时生成字母+数字的验证码, 为False时生成纯数字验证码
    code = ''
    for i in range(num):
        rand_num = str(random.randint(0, 9))
        if DefaultAlph:
            rand_alph = chr(random.randint(97, 122))
            rand_alph_upper = chr(random.randint(65, 90))
            rand_num = random.choice([rand_num, rand_alph, rand_alph_upper])
        code += rand_num
    return code
ret = rand_code(4, DefaultAlph=False)
print(ret)
生成验证码

time 模块

#常用方法
1.time.sleep(secs)
(线程)推迟指定的时间运行。单位为秒。
2.time.time()
获取当前时间戳

表示时间的三种方式

在python中,通常用这三种方式表示时间:时间戳、格式化的时间字符串、元组(struct_time)。

  • 时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
  • 格式化的时间字符串(Format String): ‘1999-12-06’
    %y 两位数的年份表示(00-99%Y 四位数的年份表示(000-9999%m 月份(01-12%d 月内中的一天(0-31%H 24小时制小时数(0-23%I 12小时制小时数(01-12%M 分钟数(00=59%S 秒(00-59%a 本地简化星期名称
    %A 本地完整星期名称
    %b 本地简化的月份名称
    %B 本地完整的月份名称
    %c 本地相应的日期表示和时间表示
    %j 年内的一天(001-366%p 本地A.M.或P.M.的等价符
    %U 一年中的星期数(00-53)星期天为星期的开始
    %w 星期(0-6),星期天为星期的开始
    %W 一年中的星期数(00-53)星期一为星期的开始
    %x 本地相应的日期表示
    %X 本地相应的时间表示
    %Z 当前时区的名称
    %% %号本身
    python中时间日期格式化符号:
  • 元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
    索引(Index) 属性(Attribute) 值(Values)
    0 tm_year(年) 比如2018
    1 tm_mon(月) 1-12
    2 tm_mday(日) 1-31
    3 tm_hour(时) 0-23
    4 tm_min(分) 0-59
    5 tm_sec(秒) 0-60
    6 tm_wday(weekday) 0-6(0表示周一)
    7 tm_yday(一年中的第几天) 1-366
    8 tm_isdst(是否是夏令时) 默认为0

认识Python中表示时间的几种格式:

# 时间模块
import time
# 时间戳
print(time.time())      # 返回当前时间的时间戳
# 结果>>> 1543743462.3950245

# 时间字符串
print(time.strftime('%Y-%m-%d %X'))
# 结果>>> 2018-12-02 17:39:58
print(time.strftime('%Y-%m-%d %H-%M-%S'))
# 结果>>> 2018-12-02 17-39-58

# 时间元组:localtime将一个时间戳转换为当前时区的struct_time
print(time.localtime())
# 结果>>> time.struct_time(tm_year=2018, tm_mon=12, tm_mday=2, tm_hour=17, tm_min=43, tm_sec=44, tm_wday=6, tm_yday=336, tm_isdst=0)

小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的。

time模块相关方法:

time.localtime([secs]):将一个时间戳转换为当前时区的struct_time;secs参数未提供,则以当前时间为准。
time.gmtime([secs]):和 localtime()类似;gmtime()方法是将一个时间戳转换为UTC时区(0 时区)的struct_time。
time.time():返回当前时间戳
time.mktime(t):将一个time.struct_time转为时间戳
time.sleep(secs):线程推迟指定的时间运行,单位为秒
time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:'Sun Dec  2 17:52:36 2018'。如果没有参数,默认将time.localtime()作为参数传入
time.ctime([t]):把一个时间戳(按秒计算的浮点数)转为time.asctime()的形式。如果参数未给或者为None的时候,默认将time.time()作为参数,相当于time.asctime(time.localtime(secs))
time.strftime(format[, t]):把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转为格式化的时间字符串,如果t未指定,默认传入time.localtime()
time.strptime(string[, format]):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作

几种格式之间的转化

# 时间戳——>结构化时间
# time.gmtime(时间戳)      #UTC时间,与英国伦敦当地时间一致
# time.localtime(时间戳)   #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间
print(time.gmtime(1510000000))
#结果>>> time.struct_time(tm_year=2017, tm_mon=11, tm_mday=6, tm_hour=20, tm_min=26, tm_sec=40, tm_wday=0, tm_yday=310, tm_isdst=0)
print(time.localtime())
#结果>>> time.struct_time(tm_year=2018, tm_mon=12, tm_mday=2, tm_hour=18, tm_min=4, tm_sec=23, tm_wday=6, tm_yday=336, tm_isdst=0)

# 结构化时间——>时间戳
# time.mktime(结构化时间)
time_tuple = time.localtime(1510000000)
print(time.mktime(time_tuple))
#结果>>> 1510000000.0
# 结构化时间——>字符串时间
# time.strftime("格式定义","结构化时间")  结构化时间参数若不传,则显示当前时间
print(time.strftime("%Y-%m-%d %X"))
#结果>>> 2018-12-02 18:07:47
print(time.strftime("%Y-%m-%d", time.localtime(1510000000)))
#结果>>> 2017-11-07

# 字符串时间——>结构化时间
# time.strptime(时间字符串,字符串对应格式)
print(time.strptime("2018-02-22", "%Y-%m-%d"))
#结果>>> time.struct_time(tm_year=2018, tm_mon=2, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=53, tm_isdst=-1)
print(time.strptime("2018/03/01", "%Y/%m/%d"))
#结果>>> time.struct_time(tm_year=2018, tm_mon=3, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=60, tm_isdst=-1)

# 结构化时间 ——> %a %b %d %H:%M:%S %Y串
# time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
print(time.asctime(time.localtime(1510000000)))
#结果>>> Tue Nov  7 04:26:40 2017
print(time.asctime())
#结果>>> Sun Dec  2 18:12:19 2018

# 时间戳 ——> %a %b %d %H:%M:%S %Y串
# time.ctime(时间戳)  如果不传参数,直接返回当前时间的格式化串
print(time.ctime())
#结果>>> Sun Dec  2 18:13:14 2018
print(time.ctime(1510000000))
#结果>>> Tue Nov  7 04:26:40 2017
# 结构化时间
struct_time = time.localtime()
struct_time = time.strptime('%s-%s-1'%(struct_time.tm_year,struct_time.tm_mon),'%Y-%m-%d')
print(time.mktime(struct_time))
# 格式化时间
ret = time.strftime('%Y-%m-1')
struct_time = time.strptime(ret,'%Y-%m-%d')
print(time.mktime(struct_time))
计算本月一号的时间戳时间

datetime 模块

相比于time模块,datetime模块的接口则更直观,更容易调用

  • datetime模块定义了下面这几个类:
  • datetime.date:表示日期的类;常用的属性有year, month, day;
  • datetime.time:表示时间的类;常用的属性有hour, minute, second, microsecond;
  • datetime.datetime:表示日期时间。
  • datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
  • datetime.tzinfo:与时区有关的相关信息。
import datetime
print(datetime.datetime.now())  # 现在的时间
# 只能调整的字段:weeks days hours minutes seconds
print(datetime.datetime.now() + datetime.timedelta(weeks=3))     # 三周后
print(datetime.datetime.now() + datetime.timedelta(weeks=-3))    # 三周前
print(datetime.datetime.now() + datetime.timedelta(days=-3))     # 三天前
print(datetime.datetime.now() + datetime.timedelta(days=3))      # 三天后
print(datetime.datetime.now() + datetime.timedelta(hours=5))     # 5小时后
print(datetime.datetime.now() + datetime.timedelta(hours=-5))    # 5小时前
print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分钟前
print(datetime.datetime.now() + datetime.timedelta(minutes=15))  # 15分钟后
print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前
print(datetime.datetime.now() + datetime.timedelta(seconds=70))  # 70秒后

current_time = datetime.datetime.now()
# 可直接调整到指定的 年 月 日 时 分 秒 等

print(current_time.replace(year=1977))  # 直接调整到1977年
print(current_time.replace(month=1))  # 直接调整到1月份
print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601

# 将时间戳转化成时间
print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17

sys 模块

sys模块是与python解释器交互的一个接口

sys.argv           命令行参数List,第一个元素是程序本身路径,(类似shell中调用脚本后面传入的$1,$2,$3)
sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version        获取Python解释程序的版本信息
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称
name = sys.argv[1]
pwd = sys.argv[2]
if name == 'xiaobai' and pwd == 'a123456':
    print('执行以下代码')
else:
    exit()
sys.argv用法

os 模块

os 模块是与操作系统交互的一个接口

#当前执行这个python文件的工作目录相关的工作路径
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')

#和文件夹相关
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

# 和文件相关
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息

# 和操作系统差异相关
os.sep      输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep  输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep  输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name     输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

# 和执行系统命令相关
os.system("bash command")  运行shell命令,直接显示
os.popen("bash command).read()  运行shell命令,获取执行结果
os.environ  获取系统环境变量

#path系列,和路径相关
os.path.abspath(path) 返回path规范化的绝对路径 
os.path.split(path)   将path分割成目录和文件名二元组返回 
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 
os.path.basename(path)返回path最后的文件名。如何path以/或\结尾,那么就会返回空值,即os.path.split(path)的第二个元素。
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)   如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)   如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path)   返回path的大小

注意:os.stat('path/filename')  获取文件/目录信息 的结构说明

stat 结构:

st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
stat 结构

练习

import os, sys

SIZE = 0
def countDirSize(path):
    global SIZE
    pathDirList = os.listdir(path)
    for fileName in pathDirList:
        newAbsPath = os.path.join(path, fileName)
        if os.path.isdir(newAbsPath):
            SIZE += os.path.getsize(newAbsPath)
            countDirSize(newAbsPath)
        else:
            SIZE += os.path.getsize(newAbsPath)
def win():
    path = input('请输入需要统计的目录>>> ')
    if os.path.exists(path):
        countDirSize(path)
    else:
        print("请输入正确的路径...")
        exit()
    return SIZE

def linux():
    path = sys.argv[1]
    if os.path.exists(path):
        countDirSize(path)
    else:
        print("请输入正确的路径...")
        exit()
    return SIZE
if __name__ == '__main__':
    if os.name == "nt":
        print(win())
    elif os.name == "posix":
        print(linux())
统计目录大小

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Python学习之旅(二十二)

下一篇:2 流程控制及循环