python3:时间方法,异常处理,系统文件相关模块(os)

标签: python3

时间方法

time模块

时间表示方法:

  • 时间戳:自1970-1-1 0:00:00到某一时间点之间的秒数
  • UTC时间:世界协调时。以英国格林威治这个城市所在的经度为基准,向东向西每15度角>划分一个时区,全球共24个时区。
  • struct_time:九元组时间。年、月、日、时、分、秒、一周中的第几天、一年中的第几>天、是否使用夏季节约时间
  • struct_time元组:
    在这里插入图片描述

time模块的方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 时间样式:
    在这里插入图片描述
    https://docs.python.org/zh-cn/3/library/time.html
>>> import time
>>> time.time()      # 返回时间戳
1581730776.0589788
>>> time.ctime()     # 返回当前的时间字符串
'Sat Feb 15 09:40:52 2020'
>>> time.ctime(0)    # 时间戳为0秒时的时间字符串
'Thu Jan  1 08:00:00 1970'
>>> time.localtime()  # 反回当前时间的struct_time 9元组
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=15, tm_hour=9, tm_min=41, tm_sec=55, tm_wday=5, tm_yday=46, tm_isdst=0)
>>> t = time.localtime()
>>> t.tm_year
2020
>>> t.tm_yday
46
>>> t.tm_wday
5
>>> time.sleep(3)   # 睡眠3秒
>>> time.strftime('%Y-%m-%d %a %H:%M:%S')  # 返回指定格式的字符串
'2020-02-15 Sat 10:18:32'
# 将时间字符串转为9元组时间格式后,可以比较时间大小
>>> time.strptime('2020-2-14 12:00:00', '%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=12, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=45, tm_isdst=-1)
>>> t1 = time.strptime('2020-2-14 12:00:00', '%Y-%m-%d %H:%M:%S')
>>> t2 = time.strptime('2020-1-14 12:00:00', '%Y-%m-%d %H:%M:%S')
>>> t1 > t2
True

datetime模块

在这里插入图片描述

  • 时间计算
    在这里插入图片描述
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2020, 2, 15, 10, 54, 16, 416819)
# 以上写法有些冗长,可以使用下面的方式替代
>>> from datetime import datetime
>>> t = datetime.now()  # 返回当前时间的年月日时分秒
>>> t.year, t.month, t.day, t.hour, t.minute, t.second
(2020, 2, 15, 10, 55, 41)
>>> t.strftime('%Y-%m-%d %H:%M:%S')  # 转成字符串形式
'2020-02-15 10:55:41'
# 将时间字符串,转换成datetime对象
>>> t = datetime.strptime('2020-02-15 10:55:41', '%Y-%m-%d %H:%M:%S')
>>> t
datetime.datetime(2020, 2, 15, 10, 55, 41)

# 得到100天1小时之前的时间,100天1小时之后的时间
>>> from datetime import datetime, timedelta
>>> days = timedelta(days=100, hours=1)
>>> t = datetime.now()
>>> t + days
datetime.datetime(2020, 5, 25, 12, 24, 15, 407633)
>>> t - days
datetime.datetime(2019, 11, 7, 10, 24, 15, 407633)

异常处理

  • 异常就是不正常,当程序遇到各种各样错误时,程序将会崩溃,终止执行。
  • 异常处理就是提前想到程序可能出现的错误,并给出解决方案。使得程序可以继续进行下
    去,不要再崩溃
  • 异常处理语法格式:
try:
    有可能发生异常的代码
except 异常1:
    发生异常1时要执行的代码
except 异常2:
    发生异常2时要执行的代码
... ...
except 异常n:
    发生异常n时要执行的代码
else:
    不发生异常才执行的代码
finally:
    不管异常是否发生,一定会执行的语速句

在这里插入图片描述

触发异常

  • 通过raise关键字,抛出异常
  • 通过assert关键字,抛出AssertionError,即断言异常

创建mydiv.py脚本,要求如下:

– 提示用户输入一个数字作为除数
– 如果用户按下Ctrl+C或Ctrl+D则退出程序
– 如果用户输入非数字字符,提示用户应该输入数字
– 如果用户输入0,提示用户0不能作为除数

#!/usr/bin/env python3
try:
    num = int(input("number: "))
    result = 100 / num
except ValueError:
    print('请输入数字')
except ZeroDivisionError:
    print('不允许使用0')
except (KeyboardInterrupt, EOFError):
    print('\nBye-bye')
else:
    print(result)  # 不发生异常才执行的语句
finally:
    print('Done')  # 不管异常是否发生都要执行的语句
print('end of program')  
#不是必须把所有的语句写全,常用的有try-except和try-finally组合

创建myerror.py脚本,要求如下:

– 编写第一个函数,函数接收姓名和年龄,如果年龄不在1到120之间,产生ValueError异常
– 编写第二个函数,函数接收姓名和年龄,如果年龄不在1到120之间,产生断言异常

#!/usr/bin/env python3
def set_age(name, age):
    if not 0 < age < 120:
        raise ValueError("age out of range.")
    print("%s is %s years old" % (name, age))
def set_age2(name, age):
    assert 0 < age < 120, 'age out of range.'
    print("%s is %s years old" % (name, age))
if __name__ == '__main__':
    set_age('bob', 25)
    set_age2('bob', 121)

os模块

在这里插入图片描述

  • os模块是python访问文件系统主要采用的模块
>>> import os
>>> os.getcwd()    # pwd
'/var/ftp/nsd2019/nsd1909/py02/day01'
>>> os.listdir()   # ls
>>> os.listdir('/tmp')   # ls /tmp
>>> os.mkdir('/tmp/nsd1909')   # mkdir /tmp/nsd1909
>>> os.makedirs('/tmp/aaa/bbb/cccc')   # mkdir -p /tmp/aaa/bbb/cccc
>>> os.chdir('/tmp/nsd1909')   # cd /tmp/nsd1909
>>> os.getcwd()
'/tmp/nsd1909'

>>> os.mknod('hi.txt')   # touch hi.txt
>>> os.listdir()
['hi.txt']
>>> os.symlink('/etc/hosts', 'zhuji')  # ln -s /etc/hosts zhuji
>>> os.remove('hi.txt')  # rm -f hi.txt
>>> os.listdir()
['zhuji']
>>> os.mknod('hello.txt')
[[email protected] day01]# ll /tmp/nsd1909/hello.txt
-rw------- 1 root root 0 215 13:45 /tmp/nsd1909/hello.txt
>>> os.chmod('hello.txt', 755)
[[email protected] day01]# ll /tmp/nsd1909/hello.txt
--wxrw--wt 1 root root 0 215 13:45 /tmp/nsd1909/hello.txt
>>> os.chmod('hello.txt', 0o755)  # 注意,linux权限是8进制数
[[email protected] day01]# ll /tmp/nsd1909/hello.txt
-rwxr-xr-x 1 root root 0 215 13:45 /tmp/nsd1909/hello.txt

实现ls -R(os.walk)

>>> mulu = list(os.walk('/tmp/nsd1909'))
>>> mulu
[('/tmp/nsd1909', ['aaa', 'abc'], ['zhuji', 'hello.txt']), ('/tmp/nsd1909/aaa', ['bbb', 'ccc'], ['a.txt', 'b.txt']), ('/tmp/nsd1909/aaa/bbb', [], ['b1.txt', 'b2.txt']), ('/tmp/nsd1909/aaa/ccc', [], ['c1.txt', 'c2.txt']), ('/tmp/nsd1909/abc', [], ['hosts', 'passwd'])]
>>> len(mulu)
5
>>> mulu[0]
('/tmp/nsd1909', ['aaa', 'abc'], ['zhuji', 'hello.txt'])
>>> mulu[1]
('/tmp/nsd1909/aaa', ['bbb', 'ccc'], ['a.txt', 'b.txt'])
>>> mulu[2]
('/tmp/nsd1909/aaa/bbb', [], ['b1.txt', 'b2.txt'])
>>> mulu[3]
('/tmp/nsd1909/aaa/ccc', [], ['c1.txt', 'c2.txt'])
>>> mulu[4]
('/tmp/nsd1909/abc', [], ['hosts', 'passwd'])
# 经分析,lumu列表由5个元组构成。每个元组拥有一样的结构。
# 每个元组有三项内容: (字符串,列表1,列表2)
# 字符串:目录路径
# 列表1:目录路径下的子目录
# 列表2:目录路径下的文件
import os
path = '/tmp/nsd1909'
# for data in os.walk(path):
#     print(data)

# for data in os.walk(path):
#     print('%s:' % data[0])
#     print(data[1])
#     print(data[2])

# for data in os.walk(path):
#     print('%s:' % data[0])
#     for zimulu in data[1]:
#         print('\033[34;1m%s\033[0m' % zimulu, end=' ')
#     for file in data[2]:
#         print(file, end=' ')
#     print('\n')

# 元组有3项,可以将这3项分别赋值给3个变量
for path, folders, files in os.walk(path):
    print('%s:' % path)
    for zimulu in folders:
        print('\033[34;1m%s\033[0m' % zimulu, end='\t')
    for file in files:
        print(file, end='\t')
    print('\n')

os.path

>>> os.path.basename('/tmp/nsd2019/abc.txt')
'abc.txt'
>>> os.path.dirname('/tmp/nsd2019/abc.txt')
'/tmp/nsd2019'
>>> os.path.split('/tmp/nsd2019/abc.txt')   # 切割路径
('/tmp/nsd2019', 'abc.txt')
>>> os.path.join('/tmp/nsd2019', 'abc.txt')  # 路径拼接
'/tmp/nsd2019/abc.txt'
>>> os.path.isfile('/etc/hosts')  # 文件存在并且是文件吗?
True
>>> os.path.isdir('/etc/hosts')   # 存在并且是目录吗?
False
>>> os.path.islink('/etc/grub2.cfg')   # 存在并且是链接文件吗?
True
>>> os.path.ismount('/')    # 存在并且是挂载点吗?
True
>>> os.path.exists('/etc')  # 存在吗?
True

pickle模块

  • 文件默认只能写入str或bytes类型的数据
  • pickle可以将任意类型的数据写入文件,还可以无损地取出来。
    在这里插入图片描述
>>> import pickle
>>> gouwu = ['方便面', '速冻水饺', '苹果']
>>> with open('/tmp/shop.data', 'wb') as fobj:
...     pickle.dump(gouwu, fobj)  # 将列表存入文件

>>> with open('/tmp/shop.data', 'rb') as fobj:
...   l = pickle.load(fobj)   # 从文件中取出数据
...
>>> l
['方便面', '速冻水饺', '苹果']
>>> type(l)
<class 'list'>

记账脚本

假设在记账时,有一万元钱
无论是开销还是收入都要进行记账
记账内容包括时间、金额和说明等
记账数据要求永久存储

#!/usr/bin/env python3
# 日期  开销  收入  余额  备注
import os
import pickle
from time import strftime

def save(fname):
    '用于记录收入'
    date = strftime('%Y-%m-%d')
    jin_e = int(input('金额: '))
    shuoming = input('备注: ')
    # 取出所有的记账内容
    with open(fname, 'rb') as fobj:
        data = pickle.load(fobj)
    yu_e = data[-1][-2] + jin_e
    # 构建最新一笔收入
    line = [date, jin_e, 0, yu_e, shuoming]
    data.append(line)
    # 将记账内容写回文件
    with open(fname, 'wb') as fobj:
        pickle.dump(data, fobj)

def cost(fname):
    '用于记录支出'
    date = strftime('%Y-%m-%d')
    jin_e = int(input('金额: '))
    shuoming = input('备注: ')
    # 取出所有的记账内容
    with open(fname, 'rb') as fobj:
        data = pickle.load(fobj)
    yu_e = data[-1][-2] - jin_e
    # 构建最新一笔支出
    line = [date, 0, jin_e, yu_e, shuoming]
    data.append(line)
    # 将记账内容写回文件
    with open(fname, 'wb') as fobj:
        pickle.dump(data, fobj)

def query(fname):
    '用于查帐'
    # 取出数据
    with open(fname, 'rb') as fobj:
        data = pickle.load(fobj)
    # 打印表头
    print('%-12s%-8s%-8s%-12s%-20s' % ('date', 'save', 'cost', 'balance', 'comment'))
    for line in data:
        print('%-12s%-8s%-8s%-12s%-20s' % tuple(line))
    #    print('%-12s%-8s%-8s%-12s%-20s' %(line[0],line[1],line[2],line[3],line[4]))

def show_menu():
    '用于展示主菜单'
    cmds = {'0': save, '1': cost, '2': query}
    prompt = '''(0) 收入
(1) 开销
(2) 查询
(3) 退出
请选择(0/1/2/3): '''
    fname = 'account.data'
    # 判断记账文件是否存在,如果不存在,初始化它
    chushi = [[strftime('%Y-%m-%d'), 0, 0, 10000, 'init data']]
    if not os.path.exists(fname):
        with open(fname, 'wb') as fobj:
            pickle.dump(chushi, fobj)

    while 1:
        xuan = input(prompt).strip()
        if xuan not in ['0', '1', '2', '3']:
            print('无效的输入,请重试。')
            continue

        if xuan == '3':
            print('\nBye-bye')
            break

        cmds[xuan](fname)

if __name__ == '__main__':
            show_menu()
版权声明:本文为LgMizar原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LgMizar/article/details/104352760

智能推荐

TYVJ 4864 天天去哪吃 || 清北学堂金秋杯大奖赛

题目描述: 记录一下i这个值上次出现的位置在哪里,就是pre...

java反编译

jvm 把Boolean类型的值flag当做int类型处理。​​​ Foo.java: 由 class 文件生成 jasm 文件:java -jar asmtools.jar jdis Foo.class > Foo.jasm  修改jasm文件: 执行反编译: java -jar jd-gui-1.6.6.jar File 打开Foo.class文件:b修改为2 重新执行java...

【学习笔记】03-v-html的学习和示例

v-html的认识和使用 示例: 显示结果: 注意:v-html是有复制的...

Java实现在线考试系统(系统介绍)

1.和现在有的考试系统有以下几种优势: a.和现在有的系统比较起来,本系统有科目、章节、老师、学生、班级等信息的管理,还有批阅试卷查看已批阅试卷等。传统的考试系统划分并不细,业务功能简单。 b.和学校的考试系统还有外面的考试系统比较起来,本系统是B/S结构,学校的考试系统一般为C/S结构,性能方面不如B/S结构,并且C/S接口需要安装客户端,客户端压力很大,我的系统只需要电脑具有浏览器,在同一局域...

计算机视觉--多视几何初步尝试

基础矩阵的原理 K和K’分别是两个相机的参数矩阵。p和p’是X在平面π的坐标表示。所以可以得出 具体计算过程 代码: #!/usr/bin/env python coding: utf-8 from PIL import Image from numpy import * from pylab import * import numpy as np from imp ...

猜你喜欢

java初学者怎么学习才可以快速入门

java初学者怎么学习才可以快速入门 一、了解JAVA 我们要知道:Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言。 Java之父:詹姆斯·高斯林 1.1 java的三个体系 Java SE(Java Platform Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境...

字段属性之主键&增删改查&自增长&唯一键约束

字段属性之主键&自增长&唯一键约束 主键 主键:primary key 主要的键 一张表中只有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能重复,这种称之为主键 一张表只能最多一个主键 增加主键 SQL操作中有多种方式增加主键大体分为三种 1.在创建表的时候直接在字段之后跟primary key关键字(主键本身不允许为空) 优点:非常直接:缺点:只能使用一个字段作为...

linux下 基于libmad的socket多用户mp3音频在线播放服务器

在众多大神的帮助下,这个在线播放流媒体服务器终于完成啦。。。。 这个mp3流媒体服务器设计的思路是,服务器程序server用多线程实现和多个客户端的通信(这是必然的),然后发送给客户端当前的音频列表公客户端选择,之后根据k客户端的选择给多个客户端传输相应mp3文件的数据,同时,客户端进行实时地音频解码并播放。 关于libmad开源mp3音频解码库的使用,见上一篇博客吧。。。。 在服务器程序这一端,...

Nginx

Nginx Nginx简介: Nginx是一个高性能的http和反向代理服务器,特点是有内存少,并发能力强,事实上Nginx的并发能力确实在同类型网页服务器中表现较好, Nginx用作web服务器:Nginx可以作为静态页面的web服务器,同时还支持CGI语言,但不支持java,java程序只能通过Tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受...

SpringCloud Alibaba - Sentinel入门案例(二)(流控规则 | 直接 / 关联 / 链路 / 快速失败 / Warm Up / 排队等待)

SpringCloud Alibaba - Sentinel入门案例(二)(流控规则 | 直接 / 关联 / 链路 / 快速失败 / Warm Up / 排队等待) 回溯 Sentinel 基本概念 正文 环境准备 流控规则介绍 简单介绍 对 阈值类型 / 单机阈值做 测试 流控模式 直接流控模式 关联流控模式 链路流控模式 资源名称的修改 链路模式正文 坑来了,怎么解决? 禁止收敛URL的入口 ...