第十四章 常用内置模块

一、sys 模块

import sys
sys.argv         # 命令行参数列表,第一个元素是程序本身路径;用于接收执行
                 # Python 脚本时传的参数
# 示例:
python3 echo.py  a b c

# echo.py 文件内容
import sys
print(sys.argv[1:])

# 输出结果
['a', 'b', 'c']

    
sys.exit(n)    # 退出程序,正常退出时exit(0)
sys.version    # 获取Python解释程序的版本信息
sys.platform   # 返回操作系统平台名称


二、os 模块

import os
# 获取当前工作目录,即当前python脚本工作的目录路径
os.getcwd()

# 切换当前脚本工作目录;相当于shell下cd
os.chdir("./dirname")      

# 创建单级目录,相当于 shell 中的 mkdir dirname
os.mkdir('dirname')

# 递归创建目录
os.makedirs('dir1/dir2')

# 删除单级空目录,若目录非空则无法删除,并报错。
os.rmdir('dirname') 

# 递归删除 空 目录
os.removedirs('dir1/dir2')  

# 列出指定目录下的所有文件和目录,包括隐藏文件,并以列表方式打印
os.listdir('dirname')

# 递归查找目录下的文件和目录,返回一个生成器对象。
# 生成器对象是个可迭代对象,每一层包含了三个值:
# 1. 当前目录路径,2. 其下面的所有子目录, 3. 其下面的所有文件
os.walk('dirname')

### 练习需求 ###
1.  在 /tmp 目录下,创建目录  a/b/c
2.  进入到 /tmp/a/b 目录下,创建一个目录 f
3.  把当前的工作目录写到 f 目录下的 work.txt 文件内。
4.  删除目录 c
5.  把 /tmp 目录下及其子目录下的所有文件和目录打印到屏幕上

os.path.exists("path")

path 需要时字符串类型
如果path存在,返回True;如果path不存在,返回False 在这里值得注意的是,
在Linux shell 中,Python会认为: / 左边一定是一个目录,而不是文件

>>> os.path.exists("/etc/passwd")
True
>>> os.path.exists("/etc/passwd/")
False
>>> os.path.exists("/etc/ddd")
False
>>>


os.path.isdir("path")

如果path是一个存在的目录,则返回True。否则返回False



os.path.isfile("path")

如果path是一个存在的文件,返回True。否则返回False



os.remove('/path/ot/file')

删除一个文件



os.rename("old_name", "new_name")

重命名文件名或目录名



os.path.split("path")

将 path 分割成目录和文件名二元组返回

>>> import os
>>> os.path.split("/etc/nginx/nginx.conf")
('/etc/nginx', 'nginx.conf')
>>> nginx_dir, nginx_conf = os.path.split("/etc/nginx/nginx.conf")
>>> nginx_dir
'/etc/nginx'
>>> nginx_conf
'nginx.conf'
>>>

注意: 这里并不关心路径是否真实存在与当前系统中



os.path.abspath("path")

返回 文件 或 path 规范化的绝对路径

>>> os.path.abspath("/path/to/file")
'/path/to/file'
>>> os.path.abspath("./file")
'/Users/yanshunjun/file'
>>> os.path.abspath("~/.bashrc")
'/Users/yanshunjun/~/.bashrc'
>>> os.path.abspath("~/file")
'/Users/yanshunjun/~/file'
>>> os.path.abspath("$HOME/file")
'/Users/yanshunjun/$HOME/file'

不支持 shell 的 变量

os.path.dirname(path) -- 重要

以 最右侧的路径分隔符为分界符把路径分隔为两部分, 返回第一部分,就是目录部分。
不关心路径是否真实存在与系统中

>>> os.path.dirname('/path/to/file')
'/path/to'
>>> os.path.dirname('/path/to/file/')
'/path/to/file'
>>>

os.path.join(path1[, path2[, ...]]) -- 常用

将多个路径组合后返回,每个路径之间不需要加路径分隔符(\或者/)

>>> os.path.join('/home', 'tom', 'bin')
'/home/tom/bin'
>>> os.path.join('/home', '/tom', 'bin')
'/tom/bin'
>>>


三、时间模块

Py3.7 官方文档 time 模块

1. time 模块

在Python中,通常有这几种方式来表示时间:

  • 时间戳(timestamp):
    通常来说,它是自Unix时代以来经过的秒数,即UTC( "世界标准时间")时间 1970 年1月1日 00:00:00 到目前经过了多少秒。

    >>> import time
    >>> time.time()
    1576916012.8988988
    >>> type( time.time() )
    <class 'float'>
    >>>
    
  • 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,当月中第几周,一年中第几天,夏令时)

    本地时间的结构化时间

    >>> time.localtime()
    time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, 
    tm_min=16, tm_sec=28, tm_wday=5, tm_yday=355, tm_isdst=0)
    >>>
    
    属性                            值
    tm_year(年)                  比如2011 
    tm_mon(月)                   1 - 12
    tm_mday(日)                  1 - 31
    tm_hour(时)                  0 - 23
    tm_min(分)                   0 - 59
    tm_sec(秒)                   0 - 61
    tm_wday(weekday)             0 - 6(0表示周一)
    tm_yday(一年中的第几天)        1 - 366
    tm_isdst(是否是夏令时)        默认为 0
    
  • 格式化的时间字符串(Format String)

>>> time.strftime("%Y-%m-%d %X")
'2019-12-21 16:17:34'
>>> time.strftime("%F %T")
'2019-12-21 16:17:42'
>>> time.strftime("%H%M%S")
'161836'
>>>

格式化时间的变量:

格式 含义
%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 时区的名字(如果不存在为空字符)
%% ‘%’字符

时间的互相转换

image.png
>>> import time
>>> time.time()
1576917412.379858
 
# 时间戳转换为结构化时间
>>> time.localtime(1576917412.379858)
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, tm_min=36, tm_sec=52, tm_wday=5, tm_yday=355, tm_isdst=0)
>>>
    
# 将 结构化时间或者时间戳转换为 格式化后的字符串时间
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1576917412.379858))
'2019-12-21 16:36:52'
>>>

# 将 字符串时间转换为结构化时间
>>> time.strptime('2019-12-21 16:36:52', '%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, tm_min=36, tm_sec=52, tm_wday=5, tm_yday=355, tm_isdst=-1)
>>>

# 将 指定的字符串时间转换为时间戳
>>> time.mktime(time.strptime('2019-12-21 16:36:52', '%Y-%m-%d %H:%M:%S'))
1576917412.0

其他日志格式转换(扩展)

# 将指定的时间戳转换为  Apa
In [178]: time.ctime(1093849081)
Out[178]: 'Mon Aug 30 14:58:01 2004'
    
In [179]: time.asctime(time.localtime())
Out[179]: 'Mon Mar 26 21:49:41 2018'
    
In [183]: time.strptime('Mon mar 04 21:53:42 2018')

In [182]: time.strptime('Mon mar 04 21:53:42 2018', "%a %b %d %H:%M:%S %Y")

其他方法

当前进程休眠 10 秒

>>> time.sleep(10)

获取到微秒

>>> time.perf_counter()
1546.612138963

2. datetime 模块

时间加减

In [ 192 ]: import datetime

In [193]: str(datetime.datetime.now())
Out[193]: '2018-03-26 22:09:44.424473'

In [194]: datetime.datetime.now() + datetime.timedelta(3)
Out[194]: datetime.datetime(2018, 3, 29, 22, 10, 42, 315584)


In [196]: datetime.datetime.now() + datetime.timedelta(minutes=30)
Out[196]: datetime.datetime(2018, 3, 26, 22, 41, 32, 44547)

时间格式转换

>>> datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m %T')
'2019-12 16:56:42'
>>> datetime.date.strftime(datetime.datetime.now(),'%Y-%m %T')
'2019-12 16:56:52'
>>>

课堂作业
创建一个文件,文件名为格式为: 自己名字的全拼秒.txt
写入一行内容: 当天的日期,格式为: 今天是:当前年
当前月_当前日
例如:
文件名: yanshunjun1107.txt
内容如下:

今天是:2019年03月_29日

查询目前服务器哪些是半年时间到期的,到期的具体时间和对应的服务器
现有的数据 服务列表,IP , 到期日期 够买时间
以当前时间点计算 + 到期日期

预约倒计时

nowtime = datetime.datetime.now()
restime = datetime.datetime.strptime("2019-09-05 12:00:00",'%Y-%m-%d %H:%M:%S')
restime - nowtime
t = restime - nowtime
print(str(t))

t.days

h,s = divmod(t.seconds, 3600)
m,s =divmod(s,60)

f"{t.days}天{h}小时{m}分{s}秒"

交互式

import datetime,time
inp = input("请输入预约时间(1970-1-1 00:00:00)")
nowtime = datetime.datetime.now()
restime = datetime.datetime.strptime(inp,'%Y-%m-%d %H:%M:%S')
t = restime - nowtime
if t.days >= 0 :
    h,s = divmod(t.seconds, 3600)
    m,s =divmod(s,60)
    print(f"{t.days}天{h}小时{m}分{s}秒")
else:
    print("时间无法倒流!")
import datetime

def handle_seconds(second):
    t = datetime.timedelta(seconds=second)

    # 计算多少小时,多少秒
    # 一个小时 3600 秒,这里divmod 内置函数取商数和余数
    h,s = divmod(t.seconds, 3600)


    # 计算多少分钟和多少秒
    m,s =divmod(s,60)


    if t.days > 0 :
        tpl = "{days}天{h}小时{m}分{s}秒"
        msg = tpl.format(days=t.days, h=h, m=m, s=s)
    elif t.days == 0 and h > 0:
        tpl = "{h}小时{m}分{s}秒"
        msg = tpl.format(h=h, m=m, s=s)
    elif h == 0 and m > 0:
        tpl = "{m}分{s}秒"
        msg = tpl.format(m=m, s=s)
    elif m == 0 and s > 0:
        tpl = "{s}秒"
        msg = tpl.format(s=s)
    else:
        msg = "刚刚"
    print(msg)

作业: 学习 计划任务模块
参考资料

apscheduler.schhenduler



四、压缩打包模块 (扩展自修)

shutil 是 Python3 中高级的文件 文件夹 压缩包 处理模块

拷贝文件

拷贝文件的内容到另一个文件中,参数是文件的相对路径或者绝对路径

import shutil
shutil.copyfile('./src.file','./dst.file')

拷贝文件和权限

import shutil
shutil.copy2('f1.log', 'f2.log')

递归拷贝

递归的去拷贝文件夹

shutil.copytree(src, dst, symlinks=False, ignore=None)

shutil.copytree('/home','/tmp/hbak',
                ignore=shutil.ignore_patterns('*.txt'))
# 递归拷贝一个文件夹下的所有内容到另一个目录下,目标目录应该是原来系统中不存在的

shutil.ignore_patterns(*patterns) 忽略某些文件

ignore=shutil.ignore_patterns('排除的文件名', '排除的文件夹名') 支持通配符,假如有多个用逗号隔开

删除

递归删除一个文件夹下的所有内容

shutil.rmtree('/tmp/hb')
shutil.rmtree('/tmp/hbad/')

# 最后结尾的一定是明确的文件名,不可以类似下面这样
shutil.rmtree('/tmp/hbak/*')

递归的去移动文件,它类似mv命令。

shutil.move('/home/src.file', './shark') 

创建压缩包并返回文件路径,例如:zip、tar

# 将 /home/shark 目录下的所以文件打包压缩到当前目录下,
# 名字 shark,格式 gztar。扩展名会自动根据格式自动生成。

shutil.make_archive('shark',         # 压缩后文件名
                    'gztar',         # 指定的压缩格式
                    '/home/shark/')  # 被压缩的文件夹名字
 
# 将 /home/shark 目录下的所以文件打包压缩到 /tmp 目录下,名字shark,格式 tar
shutil.make_archive( '/tmp/shark','tar','/home/shark/')

# 查看当前 python 环境下支持的压缩格式
ret = shutil.get_archive_formats()
print(ret)

解压缩

#                     解压的文件名   解压到哪个路径下,压缩的格式
shutil.unpack_archive('./a/b.tar.gz', './a/c/','gztar')


五、subprocess 模块执行本机系统命令

os.system() 执行的命令只是把命令的结果输出导终端,程序中无法拿到执行命令的结果。

subprocess 是开启一个系统基本的单个进程,执行 shell 命令,可以得到命令的执行结果。

# 在 shell 中运行命令,并且获取到标准正确输出、标准错误输出
In [209]: subprocess.getoutput('ls |grep t')
Out[209]: 'test.py' 

In [222]: ret = subprocess.getstatusoutput('date -u')

In [223]: ret
Out[223]: (0, '2018年 03月 26日 星期一 14:46:42 UTC')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 一、sys 模块 二、os 模块 三、时间模块 1. time 模块 在Python中,通常有这几种方式来表示时间...
    红衣漫漫阅读 157评论 0 0
  • Day05的课程要点记录详细教程地址:Day5 - 常用模块学习 | 第四篇:模块 一、模块介绍 1.1 定义 模...
    乘风逐月阅读 442评论 0 1
  • Time 模块 时间模块常用的有如下几种。 元组形式显示时间: UTC时间: 将格式化的时间转换为元组形式的时间:...
    断尾壁虎V阅读 468评论 0 1
  • shutil.copyfile( src, dst) 从源src复制到dst中去。当然前提是目标地址是具备可写权限...
    qtruip阅读 4,876评论 0 3
  • 我有几个同事酷爱喝酒,隔三差五的聚在一起豪饮,我和他们在一起喝过几次,发现他们一点也不节制,不仅对于自己,而且也这...
    snailwww阅读 145评论 0 3