博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
时间方法 异常处理 文件系统相关模块
阅读量:3943 次
发布时间:2019-05-24

本文共 13352 字,大约阅读时间需要 44 分钟。

时间方法

时间表示方式**

• 时间戳timestamp:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 # 练习自1970-1-1 00:00:00到某一时间点之间的秒数>>> import time>>> time.time()1581230314.2797847• UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时 # 练习字符串时间。以英国格林威治这个城市所在的经度为起始点,每隔15度角成为一个时区。>>> time.ctime()'Sun Feb  9 14:40:42 2020'• 元组(struct_time):由9个元素组成

struct_time元组

索引 属性
0 tm_year 2000
1 tm_mon 1-12
2 tm_mday 1-31
3 tm_hour 0-23
4 tm_min 0-59
5 tm_sec 0-61
6 tm_wday 0-6(0表示周一)
7 tm_yday(一年中的第几天) 1-366
8 tm_isdst(是否为dst时间) 默认为-1
>>> time.localtime()time.struct_time(tm_year=2020, tm_mon=2, tm_mday=9, tm_hour=14, tm_min=43, tm_sec=12, tm_wday=6, tm_yday=40, tm_isdst=0)>>> t1 = time.localtime()>>> t1.tm_year2020>>> t1.tm_hour14

time模块方法

• time.localtime([secs]):将一个时间戳转换为当前 时区的struct_time。secs参数未提供,则以当前时间为准 • time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0 时区)的struct_time• time.time():返回当前时间的时间戳 • time.mktime(t):将一个struct_time转化为时间戳

time模块方法(续1)

• time.sleep(secs):线程推迟指定的时间运行。单 位为秒 • time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:‘Sun Jun 20 23:21:05 1993’。如果没有参数,将会将time.localtime()作为参数传入 • time.ctime([secs]):把一个时间戳(按秒计算的浮 点数)转化为time.asctime()的形式

time模块方法(续2)

• time.strftime(format[, t]):把一个代表时间的元 组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。 如果t未指定,将传入time.localtime()• time.strptime(string[, format]):把一个格式化时 间字符串转化为struct_time。实际上它和strftime()是逆操作>>>	time.strftime('%Y-%m-%d	%X',  time.localtime())'2020-12-12	12:58:19'
#练习>>> import time>>> time.time()  # 自1970-1-1 00:00:00到time.time()之间的秒数1557711710.3989246>>> time.sleep(3)  # 睡眠>>> time.strftime('%Y-%m-%d %H:%M:%S')'2020-02-09 14:50:43'>>> time.strftime('%a %A')  # 周几'Mon Monday'# 练习import timeresult = 0start = time.time()for i in range(1,100000001):    result += iend = time.time()print(result)print(end-start)# 给定字符串和时间样式,将字符串转换成struct_time>>> t1 = time.strptime('2020-02-09 14:50:43', '%Y-%m-%d %H:%M:%S')>>> t1time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=9, tm_min=51, tm_sec=36, tm_wday=0, tm_yday=133, tm_isdst=-1)>>> t2 = time.localtime()>>> t2time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=9, tm_min=56, tm_sec=58, tm_wday=0, tm_yday=133, tm_isdst=0)>>> t2 > t1True>>> t2 < t1False# 练习import timet9 = time.strptime('2020-05-13 09:00:00', '%Y-%m-%d %H:%M:%S')t12 = time.strptime('2020-05-13 12:00:00', '%Y-%m-%d %H:%M:%S')with open('mylog.log') as fobj:    for line in fobj:        tstr = line[:19]  # 每一行的前19个字符是时间        # print(tstr)        t = time.strptime(tstr, '%Y-%m-%d %H:%M:%S')  # 把字符串转找成时间        if t9 < t < t12:            print(line, end='')

时间样式

格式 含义 格式 含义
%a 本地简化星期名称 %m 月份(01 - 12)
%A 本地完整星期名称 %M 分钟数(00 - 59)
%b 本地简化月份名称 %p 本地am或者pm的相应符
%B 本地完整月份名称 %S 秒(01 - 61)
%c 本地相应的日期和时间 %U 一年中的星期数(00 – 53,星期日是一个星期的开始)
%d 一个月中的第几天(01- 31) %w 一个星期中的第几天(0 - 6,0是星期天)
%H 一天中的第几个小时(24小时制,00- 23) %x 本地相应日期
%I 第几个小时(12小时制,01 - 12) %X 本地相应时间
%j 一年中的第几天(001 - 366) %y 去掉世纪的年份(00 - 99)
%Z 时区的名字 %Y 完整的年份

datetime模块

datetime模块方法

• datetime.today():返回一个表示当前本地时间的datetime对象 • datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间 • datetime.strptime(date_string, format):将格式字符串转换为datetime对象 • datetime.ctime(datetime对象):返回时间格式字符串 • datetime.strftime(format):返回指定格式字符串# 练习>>> from datetime import datetime#返回的对象,各部分是年月日时分秒毫秒>>> datetime.now()datetime.datetime(2020, 5, 13, 10, 43, 57, 336172)>>> t = datetime.now()>>> t.year2020>>> t.month5>>> t.day13>>> t.hour10>>> t.minute44>>> t.second39>>> t.microsecond319444# 练习 from datetime import datetimet9 = datetime.strptime('2020-05-13 09:00:00', '%Y-%m-%d %H:%M:%S')t12 = datetime.strptime('2020-05-13 12:00:00', '%Y-%m-%d %H:%M:%S')with open('mylog.log') as fobj:    for line in fobj:        tstr = line[:19]        t = datetime.strptime(tstr, '%Y-%m-%d %H:%M:%S')        if t9 < t < t12:            print(line, end='')>>> t.strftime('%Y%m%d %H:%M:%S')'20200513 10:44:39'>>> datetime.strptime('2020-05-13 12:00:00', '%Y-%m-%d %H:%M:%S')datetime.datetime(2020, 5, 13, 12, 0)>>> t1 = datetime(2020, 5, 13)>>> t1datetime.datetime(2020, 5, 13, 0, 0)

时间计算

• 使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算>>>	dt = datetime.datetime.now()>>>	days = datetime.timedelta(days=100,	hours=3)>>>	dt + daysdatetime.datetime(2020,	6,	10,	20,	41,	20,	106546)# 练习>>> from datetime import datetime, timedelta>>> t1 = datetime.now()>>> d1 = timedelta(days=100, hours=1)>>> t1 - d1  # 100天零1小时之前的时间datetime.datetime(2020, 2, 2, 10, 23, 29, 737582)>>> t1 + d1  # 100天零1小时之后的时间datetime.datetime(2020, 8, 21, 12, 23, 29, 737582)

异常处理

异常

什么是异常

• 当python检测到一个错误时,解释器就会指出当前 流已经无法继续执行下去,这时候就出现了异常 • 异常是因为程序出现了错误而在正常控制流以外采取 的行为 • 这个行为又分为两个阶段:     – 首先是引起异常发生的错误     – 然后是检测(和采取可能的措施)阶段

python中的异常

• 当程序运行时,因为遇到未解的错误而导致中止运行,便会出现traceback消息,打印异常• 当程序不能正常工作时,程序出现错误,它将崩溃终止执行,这时程序默认向终端抛出异常。
异常 描 述
NameError 未声明/初始化对象
IndexError 序列中没有没有此索引
SyntaxError 语法错误
KeyboardInterrupt 用户中断执行
EOFError 没有内建输入,到达EOF标记
IOError 输入/输出操作失败

try-except语句

• 定义了进行异常监控的一段代码,并且提供了处理异常的机制try:try_suite #监控这里的异常except Exception[as	reason]:except_suite #异常处理代码>>>	try:		f =	open('foo.txt')	except FileNotFoundError:		print('No	such	file')...No such	file

带有多个expect的try语句

• 可以把多个except语句连接在一起,处理一个try块中可能发生的多种异常>>>	try:		data = int(input('input a number: '))	except KeyboardInterrupt:		print 'user	cancelled'	except ValueError:		print('you must input a number!’)...input a	number:	helloyou	must input a number!

异常参数

• 异常也可以有参数,异常引发后它会被传递给异常处理器 • 当异常被引发后参数是作为附加帮助信息传递给异常处理器的>>>	try:		10 / 0	except ZeroDivisionError as	e:		print('error',	e)...error division by zero

简化除法判断

1. 提示用户输入一个数字作为除数2. 如果用户按下Ctrl+C或Ctrl+D则退出程序3. 如果用户输入非数字字符,提示用户应该输入数字4. 如果用户输入0,提示用户0不能作为除数# 练习把有可能发生异常的语句,放到try中执行。通过except捕获异常,异常不发生才需要执行的语句,放到else中。异常不管是否发生,都要执行的语句,放到finally中try:    nums = int(input('number: '))    result = 100 / numsexcept (ValueError, ZeroDivisionError):    print('无效输入')except (KeyboardInterrupt, EOFError):    print('\nBye-bye')else:    print(result)finally:    print('Done')在编写程序时,并不总是需要写全部的语法,用的最多的组合是try-except和try-finally# 练习stack = []def push_it():    try:        item = input('数据: ').strip()    except (KeyboardInterrupt, EOFError):        print()   # 默认打印\n        return    # 默认返回None。类似于循环的break, return会结束函数    if item:        stack.append(item)def pop_it():    if stack:        print('\033[31;1m从表中弹出: %s\033[0m' % stack.pop())    else:        print('\033[31;1m空列表\033[0m')def view_it():    print('\033[32;1m%s\033[0m' % stack)def show_menu():    cmds = {
'0': push_it, '1': pop_it, '2': view_it} prompt = ''''(0) 压栈(1) 出栈(2) 查询(3) 退出请选择(0/1/2/3): ''' while True: try: choice = input(prompt).strip() except (KeyboardInterrupt, EOFError): choice = '3' if choice not in ['0', '1', '2', '3']: print('无效的输入,请重试。') continue if choice == '3': print('\nBye-bye') break cmds[choice]()if __name__ == '__main__': show_menu()

else子句

• 在try范围中没有异常被检测到时,执行else子句 • 在else范围中的任何代码运行前,try范围中的所有代码必须完全成功>>>	try:		result = 100  /	int(input("number: "))	except Exception as	e:		print('Error:',	e)	else:		print(result)...number:	1010.0

finally子句

• finally子句是无论异常是否发生,是否捕捉都会执行的一段代码 • 如果打开文件后,因为发生异常导致文件没有关闭,可能会发生数据损坏。使用finally可以保证文件总是能正常的关闭

触发异常

raise语句

• 要想引发异常,最简单的形式就是输入关键字raise,后面跟要引发的异常的名称 • 执行raise语句时,Python会创建指定的异常类的一个对象 • raise语句还可指定对异常对象进行初始化的参数

断言

• 断言是一句必须等价于布尔值为真的判定 • 此外,发生异常也意味着表达式为假>>>	assert 10 >	100, "Wrong"Traceback (most	recent call last):	File "
", line 1, in
AssertionError: Wrong

自定义异常

1. 编写第一个函数,函数接收姓名和年龄,如果年龄 不在1到120之间,产生ValueError异常2. 编写第二个函数,函数接收姓名和年龄,如果年龄 不在1到120之间,产生断言异常# 练习def set_age(name, age):    if not 0 < age < 120:        raise ValueError('年龄超出范围')    print('%s is %d years old' % (name, age))def set_age2(name, age):    assert 0 < age < 120, '年龄超出范围'    print('%s is %d years old' % (name, age))if __name__ == '__main__':    # set_age('崔军', 244)    try:        set_age('崔军', 244)    except ValueError as e:        print('Error:', e)    set_age2('崔军', 244)

相关模块

os模块

os模块简介

• 对文件系统的访问大多通过python的os模块实现 • 该模块是python访问操作系统功能的主要接口 • 有些方法,如copy等,并没有提供,可以使用shutil模块作为补充

os模块方法

函数 作 用
symlink() 创建符号链接
listdir() 列出指定目录的文件
getcwd() 返回当前工作目录
mkdir() 创建目录
chmod() 改变权限模式
getatime() 返回最近访问时间
chdir() 改变工作目录
>>> import os>>> os.getcwd()   # pwd>>> os.listdir()  # ls>>> os.listdir('/home')  # ls /home>>> os.mkdir('/tmp/demo')  # mkdir /tmp/demo>>> os.makedirs('/tmp/aaa/bbb/ccc') # mkdir -p /tmp/aaa/bbb/ccc>>> os.chdir('/tmp/demo')  # cd /tmp/demo>>> os.getcwd()'/tmp/demo'>>> os.listdir()[]>>> os.symlink('/etc/hosts', 'zhuji')  # ln -s>>> import shutil>>> shutil.copy('/etc/passwd', 'passwd')'passwd'>>> os.listdir()['zhuji', 'passwd']>>> os.stat('passwd')os.stat_result(st_mode=33188, st_ino=408593036, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=2727, st_atime=1557732810, st_mtime=1557732810, st_ctime=1557732810)>>> mima = os.stat('passwd')>>> mima.st_size2727>>> time.ctime(mima.st_atime)'Mon May 13 15:33:30 2019'>>> os.chmod('passwd', 0o755)   # chmod 755 passwd>>> os.chmod('passwd', 420)  # chmod 644 passwd>>> os.chown('passwd', 1014, 1015)  # chown>>> os.listdir()['zhuji', 'passwd']>>> os.remove('zhuji')  # rm -f>>> os.listdir()['passwd']]# stat 目录/文件
>>> os.getcwd()'/tmp/demo'>>> os.listdir()['passwd']>>> os.path.abspath('passwd')'/tmp/demo/passwd'>>> fname = os.path.abspath('passwd')>>> fname'/tmp/demo/passwd'>>> os.path.basename(fname)'passwd'>>> os.path.dirname(fname)'/tmp/demo'>>> os.path.split(fname)('/tmp/demo', 'passwd')>>> os.path.join('/tmp/demo', 'passwd')'/tmp/demo/passwd'>>> os.path.isdir('/etc/abc')  # [ -d /etc/abc ]False>>> os.path.isfile('/etc/hosts') # [ -f /etc/hosts ]True>>> os.path.islink('/etc/grub2.cfg')  # 是链接吗?True>>> os.path.ismount('/boot')  # 是挂载点吗?True>>> os.path.exists('/etc')   # 存在吗?True

操作文件系统

• 编写脚本,熟悉os模块操作1. 切换到/tmp目录2. 创建example目录3. 切换到/tmp/example目录4. 创建test文件,并写入字符串foo bar5. 列出/tmp/exaple目录内容6. 打印test文件内容7. 反向操作,把test文件以及example目录删除

pickle模块

pickle模块简介

• 把数据写入文件时,常规的文件方法只能把字符串对 象写入。其他数据需先转换成字符串再写入文件 。 • python提供了一个标准的模块,称为pickle。使用它可以在一个文件中储存任何python对象,之后又可以把它完整无缺地取出来

pickle模块方法

• 分别调用dump()和load()可以存储、写入>>>	import pickle as p>>>	shoplistfile = 'shoplist.data'>>>	shoplist = ['apple', 'mango', 'carrot']>>>	f =	file(shoplistfile,	'wb')>>>	p.dump(shoplist, f)>>>	f.close()>>>>>>	f =	file(shoplistfile)>>>	storedlist = p.load(f)>>>	print storedlist['apple', 'mango', 'carrot']

常规的文件,只能写入字符串,不能写其他数据类型

>>> f = open('/tmp/data', 'w')>>> f.write('ni hao\n')7>>> f.write({
'name': 'bob', 'age': 20})Traceback (most recent call last): File "
", line 1, in
TypeError: write() argument must be str, not dict>>> f.close()

pickle模块可以把任意的数据类型写入到文件,还可以无损地取出来。

>>> import pickle>>> shop_list = {
'eggs': 2, 'apple': 5, 'banana': 5}>>> with open('/tmp/shop.data', 'wb') as fobj:... pickle.dump(shop_list, fobj)>>> with open('/tmp/shop.data', 'rb') as fobj:... mydict = pickle.load(fobj)>>> type(mydict)
>>> mydict{
'eggs': 2, 'apple': 5, 'banana': 5}>>> mydict['apple']5

记账程序

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

1.记账的样式

日期 收入 支出 余额 备注
2020-05-13 0 0 10000 init
2020-05-14 10000 0 20000 salary
2020-05-14 0 200 19800 eat

2.记录的表示方式

records = [    ['2020-05-13', 0, 0, 10000, 'init'],    ['2020-05-14', 10000, 0, 20000, 'salary'],    ['2020-05-14', 0, 200, 19800, 'eat'],]

3.列表的形成

只有收入、支出和备注是手工录入的,其他字段需要程序自动完成。

4.取出最新余额

records[-1][-2]
# 练习import osimport picklefrom time import strftimedef save(fname):    try:        amount = int(input('金额: '))        comment = input('备注: ')    except (KeyboardInterrupt, EOFError, ValueError):        print('\n无效输入,返回。')        return    date = strftime('%Y-%m-%d')    with open(fname, 'rb') as fobj:        records = pickle.load(fobj)        balance = records[-1][-2] + amount    record = [date, amount, 0, balance, comment]    records.append(record)    with open(fname, 'wb') as fobj:        pickle.dump(records, fobj)def cost(fname):    try:        amount = int(input('金额: '))        comment = input('备注: ')    except (KeyboardInterrupt, EOFError, ValueError):        print('\n无效输入,返回。')        return    date = strftime('%Y-%m-%d')    with open(fname, 'rb') as fobj:        records = pickle.load(fobj)        balance = records[-1][-2] - amount    record = [date, 0, amount, balance, comment]    records.append(record)    with open(fname, 'wb') as fobj:        pickle.dump(records, fobj)def query(fname):    print('%-12s%-8s%-8s%-12s%-20s' % ('date', 'save', 'cost', 'balance', 'comment'))    with open(fname, 'rb') as fobj:        records = pickle.load(fobj)    for record in records:        print('%-12s%-8s%-8s%-12s%-20s' % tuple(record))def show_menu():    cmds = {
'0': save, '1': cost, '2': query} prompt = '''(0) 收入(1) 支出(2) 查询(3) 退出请选择(0/1/2/3): ''' fname = 'account.data' if not os.path.exists(fname): init_data = [ ['2019-05-13', 0, 0, 10000, 'init'], ] with open(fname, 'wb') as fobj: pickle.dump(init_data, fobj) while True: try: choice = input(prompt).strip() except (KeyboardInterrupt, EOFError): choice = '3' if choice not in ['0', '1', '2', '3']: print('无效的选择,请重试。') continue if choice == '3': print('\nBye-bye') break cmds[choice](fname)if __name__ == '__main__': show_menu()

转载地址:http://vhnwi.baihongyu.com/

你可能感兴趣的文章
虚拟机VMware中实现linux与windows的共享
查看>>
undefined reference问题总结
查看>>
souce insight 3.5 修改背景颜色
查看>>
Linux 关闭/开启图形界面(X-window) 命令
查看>>
debug 打印 开关 设计(for c || C++)
查看>>
vmware中虚拟机和主机ping不通的问题。
查看>>
从“冷却时间”谈产品设计
查看>>
常用shell脚本
查看>>
长网站 转换为 短网址 的原理
查看>>
基于http协议的C语言客户端代码
查看>>
我常用的makefile之产生优秀的.depend文件
查看>>
VMware无法识别USB设备的解决方法 以及 从虚拟机中断开USB设备,使其重新连接到windows主机上
查看>>
linux下C代码、C++代码和命令行方式,完成字符集编码的转换
查看>>
写代码就像写作文
查看>>
常用shell特殊符号变量一览
查看>>
如何做事
查看>>
架构实践 - 1. 架构风格
查看>>
架构实践 - 3. 基于事件系统的demo
查看>>
架构实践 - 4. 架构设计之进程通信(独立构件风格)
查看>>
架构实践 - 5. 基于进程通信的demo
查看>>