Python之路day16-time_datetime_sys_os模块

155次阅读
没有评论

前言时刻

今天学习了 Python 中比较重要的模块:time、sys等,都是很重要的。

总结一波:

time:sleep、gmtime、localtime、mktime、strftime、strptime

datetime:date、time、datetime、timedelta

os,sys

1、time模块

time模块中主要分为三种状态,一种是时间戳,一种是结构时间(stuct_time),另外一种是字符串时间,所以学习 time 模块就是玩这三种状态之间的转化。

1.1 时间戳

什么是时间戳呢?时间戳是从1970年1月1号0点0分0秒到现在所经历的秒数,一般单位是秒,但是也有以毫秒位单位的。

import time

# 1、时间戳
# 输出从1970年1月1号0点0分0秒到现在所经历的秒数
time.time()   # 1621734149.9351869

1.2 结构化时间

什么是结构化时间?这个是Python 内部的一种表示时间的类,直观且利于与其他状态互转。

返回结构化时间的函数有time.gmtime(), time.localtime(), time.strptime()

例如:

time.struct_time(tm_year=2021, tm_mon=5, tm_mday=23, tm_hour=2, tm_min=19, tm_sec=56, tm_wday=6, tm_yday=143, tm_isdst=0)

1. 时间戳转结构化时间

time.gmtime():默认是将时间戳转成格林尼治时间结构。参数传入秒数,默认是time.time()

由于我们中国是东八区时区,时间是不一样的,需要用 localtime 函数 。

time.localtime():将时间戳转成当地时间结构。参数传入秒数,默认是time.time()

# 2.1、时间戳转结构化时间
strcut_t = time.gmtime(time.time())  # 传入秒数,默认是time.time()
# time.struct_time(tm_year=2021, tm_mon=5, tm_mday=23, tm_hour=1, tm_min=48, tm_sec=26, tm_wday=6, tm_yday=143, tm_isdst=0)

time.localtime(0)
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

2. 结构化时间转时间戳

time.mktime(struct_time):是 localtime 的反函数,将结构化时间转时间戳。

# 2.2 结构时间转时间戳
time.mktime(strcut_t)   # 1621706152.0

1.3 字符串时间

字符串时间是什么?其实本质上就是字符串,但是内容是时间例如:"2021-05-23"。如果此时老板给你一个任务就是将这个字符串时间转为时间戳,你会咋办?是用正则还是 split 还是看下面👇。

指令 含义 注释
%a 本地化的缩写星期中每日的名称。
%A 本地化的星期中每日的完整名称。
%b 本地化的月缩写名称。
%B 本地化的月完整名称。
%c 本地化的适当日期和时间表示。
%d 十进制数 [01,31] 表示的月中日。 常用
%H 十进制数 [00,23] 表示的小时(24小时制)。 常用
%I 十进制数 [01,12] 表示的小时(12小时制)。
%j 十进制数 [001,366] 表示的年中日。
%m 十进制数 [01,12] 表示的月。 常用
%M 十进制数 [00,59] 表示的分钟。 常用
%p 本地化的 AM 或 PM 。 (1)
%S 十进制数 [00,61] 表示的秒。 (2)
%U 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)。 在第一个星期日之前的新年中的所有日子都被认为是在第 0 周。 (3)
%w 十进制数 [0(星期日),6] 表示的周中日。
%W 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 在第一个星期一之前的新年中的所有日子被认为是在第 0 周。 (3)
%x 本地化的适当日期表示。
%X 本地化的适当时间表示。
%y 十进制数 [00,99] 表示的没有世纪的年份。 常用
%Y 十进制数表示的带世纪的年份。
%z 时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, +23:59] 。
%Z 时区名称(如果不存在时区,则不包含字符)。
%% 字面的 '%' 字符。

1. 字符串时间转格式化时间

time.strptime(string, format):将字符串转格式化的时间,具体 format 的格式看上方👆。

# 3.1 字符串转结构时间 
time.strptime("2021-5-23", "%Y-%m-%d")
# time.struct_time(tm_year=2021, tm_mon=5, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=143, tm_isdst=-1)

学完这个 strptime 函数,就可以解决上面"老版留的任务了"。

1)字符串时间转时间戳

思路就是:以结构时间作为媒介,使用 strptime 将字符串时间->结构时间,然后使用mktime,将结构时间->时间戳

# 字符串时间转时间戳
time_str = "2021-5-23"
time_struct = time.strptime(time_str, "%Y-%m-%d")
time_stamp = time.mktime(time_struct)
print(f"time_str:{time_str}, timestamp:{time_stamp}")
# time_str:2021-5-23, timestamp:1621699200.0

2. 格式化时间转字符串时间

time.strftime(format, struct_time):将格式化时间转为字符串时间,具体 format 的格式看上方👆。

# 格式化时间转字符串时间
time_str2 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(time_str2)   # 2021-05-23 11:56:54

time模块总结:可能你觉得 strftime 和 strptime 区分不开,我是这样记得,strftime = str + f + time,f是 format (格式化)的缩写,所以 strftime 是将结构化时间转成格式化的字符串时间的。而 strptime 与 strftime 是相对的,则是字符串时间转格式化时间。

2、datetime模块

如果说 time 模块是关于时间的标准库,那么可以说 datetime 模块是关于时间的升级版,主要用于处理日期和时间的类。

datetime 模块中有三个重要的类:time 、 date 和 datetime 类,第一个是处理时间的,而第二个是处理日期的,最后一个就是综合前面两个的可处理时间和日期。

2.1 time类

import datetime

# 1、time类
s = datetime.time(17, 3, 22)   # 传入参数:时 分 秒 微秒
print(s)   # 17:03:22

2.2 date类

datetime.date():参数year、month、 day。

# 2、date类
s2 = datetime.date(2021, 5, 23)   # 传入参数是年月日
print(s2)   # 2021-05-23

2.3 datetime类

datetime.date():参数属性:year, month, day, hour, minute, second, microsecond, and tzinfo。需重点掌握。

# 3、datetime类

s3 = datetime.datetime(2021, 5, 23, 17, 3, 22)
print(s3)   # 2021-05-23 17:03:22

其实上面都是铺垫,真正重要的是下面的timedelta类,为啥重要的,因为他是关于日期的算术运算方法。时间中用的最多的就是日期的加减,所以很重要。

2.4 timedelta类

datetime.timedelta():参数属性:days, hours, weeks, minutes, seconds, microseconds。需重点掌握。注意这里面并没有

# 4、datedelta
t1 = datetime.timedelta(days=2,hours=6, minutes=30)
# 2 days, 6:30:00

(1)datetime类型 + timedelta,返回的是 datetime 类

# 4.1 datetime+timedelta
s3 = datetime.datetime(2021, 5, 23, 17, 3, 22)
print(s3)   # 2021-05-23 17:03:22

s4 = s3 + t1
print(f"s4:{s4}, type:{type(s4)}")
# s4:2021-05-25 23:33:22, type:<class 'datetime.datetime'>

(2)date 类型+ timedelta ,返回的是 date 类

# 4.2 date+timedelta
s5 = datetime.date(2021, 5, 24)
s6 = s5 + t1
print(f"s6:{s6}, type:{type(s6)}")
# s6:2021-05-26, type:<class 'datetime.date'>
# 可以看出date类型与timedelta相加时,只加的是date中的year、month、day

(3)timedelta 类型+ timedelta ,返回的是 timedelta 类

# 4.3 timedelta+timedelta类型
t2 = datetime.timedelta(days=6, hours=8)
t3 = t1 + t2
print(f"t3:{t3}, type:{type(t3)}")
# t3:8 days, 14:30:00, type:<class 'datetime.timedelta'>

好了,datetime的常用用法就写到这,以后更高级的用法再更新。

3、os模块

首先os模块是干什么的?os(operation system) 模块是于操作系统息息相关的模块,其调用的是系统底层的用法。

os模块真的很实用很强大,重点掌握,一定要手敲一遍,加深印象。这里进介绍常用的 os 模块,如和文件操作有关以及和路径有关的模块。

(1)与文件操作有关的模块:

import os
# 1、和文件操作有关的模块

file_path = "/test/666.txt"
folder_path = "/test/te"

# 1.1 删除文件或者空文件夹
os.remove(file_path)

# 1.2 重命名文件或文件夹
os.rename(old_p, new_p)

# 1.3 删除文件夹,但文件夹需为空,否则报错
os.remove(folder_path)
# 若需删除非空文件夹,可用用shutil中retree函数
import shutil
shutil.rmtree(folder_path)

(2)与文件路径有关的模块:

  • os.path.split(file_path):将 file_path 按按最后一个斜杠 / 拆分为两个 head 和 tail ,如果file_path是以斜杠结尾,则 tail 为空。
  • os.path.basename(folder_path):返回上述 split 中的第二个元素 tail 值。
  • os.path.dirname():返回上述 split 中的第一个元素 head 值。
  • os.path.join(folder_path, file_name):拼接路径
  • os.path.abspath(folder_path):返回路径的绝对路径。
  • os.sep():返回当前系统的文件分割符号,其中Mac下是/,Windows下是\,Linux下是/
# os.path
# 2、与文件操作有关的模块

folder_path = "test02"
file_path = 'test2.txt'

# 2.1 取路径的名称和父目录路径
base_name = os.path.basename(folder_path)
dir_name = os.path.dirname(os.path.abspath(folder_path))
print(dir_name, base_name, sep='|')   # ...|test02
# 其实也可以使用split方法,等同于上面两个函数
dir_name, base_name = os.path.split(folder_path)

# 2.2 拼接路径
os.path.join(folder_path, '666.txt')   # test02/666.txt

# 2.3 取路径的绝对路径
os.path.abspath(folder_path)   # .../test02
# 上面的 folder_path 就是一个相对路径

判断文件的属性:

  • os.path..isdir(path):判断是否是文件夹,是则返回True,反之False。
  • os.path.isabs(path):判断路径是否是绝对路径,是则返回True,反之False
  • os.path.isfile(path):判断是否是文件,是则返回True,反之False
  • os.path.exists(path):判断文件是否存在,是则返回True,反之False
# 2.4 判断文件的属性

# 判断是否是文件夹,是则返回True,反之False
os.path.isdir(folder_path)   # True

# 判断路径是否是绝对路径,是则返回True,反之False
os.path.isabs(folder_path)   # False

# 判断是否是文件,是则返回True,反之False
os.path.isfile(file_path)   # True

# 判断文件是否存在,是则返回True,反之False
os.path.exists(file_path)   # True

新增:

  • os.walk(path, topdown=True)方法:迭代生成目录树的名称
# os.walk 
import os
res = os.walk('../test06')
for each in res:
    print(each)
    # ('../test06', ['test03'], ['untitled.txt'])
    # ……

os.walk方法,返回该文件夹下的文件夹和文件名,元组格式,第一个是文件夹路径,后面的都是该文件夹中的文件。

4、sys模块

sys(system)模块是与 Python 系统的相关的模块,常用的用法如下:

  1. sys.path():指定搜索模块的路径
  2. sys.modules:返回系统已经加载的模块。
  3. sys.argv:获取给脚本传递的参数,返回列表。
import sys
# 1、指定搜索模块的路径
sys.path
sys.path.append("your_module_dir_path")

# 2、返回系统已经加载的模块
sys.modules
# 3、获取给脚本传递的参数,返回list

# import sys
# print(sys.argv)

jiaozhuzhang@MacBook-Pro test02 % python3 argv_test.py -name "test" -p "./test02"
['argv_test.py', '-name', 'test', '-p', './test02']

总结:

今天的内容挺多的,写博客也花了半天时间,不过还是值得的,多看多练多总结。

参考文章:

Python官方文档:https://docs.python.org/zh-cn/3.8/library/time.html#time.mktime

https://docs.python.org/zh-cn/3.8/library/datetime.html

3
西园公子
版权声明:本站原创文章,由西园公子2021-05-26发表,共计6606字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
载入中...