本文共 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个元素组成
索引 | 属性 | 值 |
---|---|---|
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.localtime([secs]):将一个时间戳转换为当前 时区的struct_time。secs参数未提供,则以当前时间为准 • time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0 时区)的struct_time• time.time():返回当前时间的时间戳 • time.mktime(t):将一个struct_time转化为时间戳
• time.sleep(secs):线程推迟指定的时间运行。单 位为秒 • time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:‘Sun Jun 20 23:21:05 1993’。如果没有参数,将会将time.localtime()作为参数传入 • time.ctime([secs]):把一个时间戳(按秒计算的浮 点数)转化为time.asctime()的形式
• 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.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检测到一个错误时,解释器就会指出当前 流已经无法继续执行下去,这时候就出现了异常 • 异常是因为程序出现了错误而在正常控制流以外采取 的行为 • 这个行为又分为两个阶段: – 首先是引起异常发生的错误 – 然后是检测(和采取可能的措施)阶段
• 当程序运行时,因为遇到未解的错误而导致中止运行,便会出现traceback消息,打印异常• 当程序不能正常工作时,程序出现错误,它将崩溃终止执行,这时程序默认向终端抛出异常。
异常 | 描 述 |
---|---|
NameError | 未声明/初始化对象 |
IndexError | 序列中没有没有此索引 |
SyntaxError | 语法错误 |
KeyboardInterrupt | 用户中断执行 |
EOFError | 没有内建输入,到达EOF标记 |
IOError | 输入/输出操作失败 |
• 定义了进行异常监控的一段代码,并且提供了处理异常的机制try:try_suite #监控这里的异常except Exception[as reason]:except_suite #异常处理代码>>> try: f = open('foo.txt') except FileNotFoundError: print('No such file')...No such file
• 可以把多个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()
• 在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可以保证文件总是能正常的关闭
• 要想引发异常,最简单的形式就是输入关键字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)
• 对文件系统的访问大多通过python的os模块实现 • 该模块是python访问操作系统功能的主要接口 • 有些方法,如copy等,并没有提供,可以使用shutil模块作为补充
函数 | 作 用 |
---|---|
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目录删除
• 把数据写入文件时,常规的文件方法只能把字符串对 象写入。其他数据需先转换成字符串再写入文件 。 • python提供了一个标准的模块,称为pickle。使用它可以在一个文件中储存任何python对象,之后又可以把它完整无缺地取出来
• 分别调用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/