• 【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)


     本站以分享各种运维经验和运维所需要的技能为主

    《python零基础入门》:python零基础入门学习

    《python运维脚本》: python运维脚本实践

    shell》:shell学习

    《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

    《k8》暂未更新

    docker学习》暂未更新

    《ceph学习》ceph日常问题解决分享

    《日志收集》ELK+各种中间件

    《运维日常》运维日常

    《linux》运维面试100问

    时间表示方法和异常处理

    时间表示方法:

     

    time模块:

    时间表示方法:

    • 时间戳:自1970-1-1 0:0:0到某一时间之间的秒数

    • UTC时间,世界协调时.

    • struct_time元组:9个元素组成:(年月日时分秒,一周中第几天,一年中的第几天,是否是夏季节约时间--原来时间-1)

    闰秒---- 61

    1. >>> import time
    2. #获取当时的时间戳
    3. >>> time.time()
    4. 1575854726.0655887  -----1970--至今
    5. #获取UTC的字符串形式时间
    6. >>> time.ctime()
    7. 'Mon Dec  9 09:26:30 2019'
    8. #获取当前时间的9元组
    9. >>> time.localtime()
    10. time.struct_time(tm_year=2019, tm_mon=12, tm_mday=9, tm_hour=9, tm_min=27, tm_sec=2, tm_wday=0, tm_yday=343, tm_isdst=0)
    11. >>> t = time.localtime()
    12. >>> t.tm_year
    13. 2019
    14. >>> t.tm_yday
    15. 343
    16. #算数计时器:
    17. import time
    18. result = 0
    19. start = time.time()
    20. for i in range(1,10000001):
    21.     result += i
    22. end = time.time()
    23. print(result)
    24. print(end - start)
    25. #睡眠3
    26. >>> import time
    27. >>> time.sleep(3)
    28. #返回特定的时间格式
    29. >>> time.strftime('%Y-%m-%d %H:%M:%S')
    30. '2019-12-09 09:48:38'
    31. >>> time.strftime('%a %A')
    32. 'Mon Monday'
    33. #把时间字符串转化为9元素组格式
    34. >>> t = time.strptime('2019-12-09 09:48:38', '%Y-%m-%d %H:%M:%S')
    35. >>> t.tm_year
    36. 2019
    37. >>> time.strptime('2019-12-09 09:48:38', '%Y-%m-%d %H:%M:%S')
    38. time.struct_time(tm_year=2019, tm_mon=12, tm_mday=9, tm_hour=9, tm_min=48, tm_sec=38, tm_wday=0, tm_yday=343, tm_isdst=-1)
    39. #应用
    40. import time
    41. t9 = time.strptime('2019-12-09 09:00:00', '%Y-%m-%d %H:%M:%S')
    42. t12 = time.strptime('2019-12-09 12:00:00', '%Y-%m-%d %H:%M:%S')
    43. with open('mylog.txt') as fobj:
    44.     for line in fobj:
    45.         t = time.strptime(line[:19],'%Y-%m-%d %H:%M:%S')
    46.         if t > t12 :
    47.             break
    48.         if t >=t9:
    49.             print(line,end='')
    50. # with open('mylog.txt') as fobj:
    51. #     for line in fobj:
    52. #         t = time.strptime(line[:19],'%Y-%m-%d %H:%M:%S')
    53. #         if t9 <= t <= t12 :
    54. #             print(line,end='')

     datetime模块:

    1. 简单应用:
    2. >>> from datetime import datetime
    3. >>> datetime.now()
    4. datetime.datetime(2019, 12, 9, 10, 48, 9, 388722)
    5. >>> t.year
    6. 2019
    7. >>> t.month
    8. 12
    9. >>> t.day
    10. 9
    11. >>> t.min
    12. t.min     t.minute 
    13. >>> t.minute
    14. 48
    15. >>> t.hour
    16. 10
    17. >>> t.second
    18. 52
    19. >>> t.microsecond
    20. 887151
    21. >>> t9 = datetime.strptime('2019-12-9 10:55:29' , '%Y-%m-%d %H:%M:%S') #指定字符串转成datetime对象
    22. >>> t9
    23. datetime.datetime(2019, 12, 9, 10, 55, 29)
    24. >>> t = datetime.now()
    25. >>> t
    26. datetime.datetime(2019, 12, 9, 10, 55, 29, 493483)
    27. >>> t.strftime('%Y/%m/%d %H:%M:%S')   #datetime对象转成指定字符串 
    28. '2019/12/09 10:55:29'
    29. 案例一:
    30. from datetime import datetime
    31. t9 = datetime.strptime('2019-12-09 09:00:00', '%Y-%m-%d %H:%M:%S')
    32. t12 = datetime.strptime('2019-12-09 12:00:00', '%Y-%m-%d %H:%M:%S')
    33. with open('mylog.txt') as fobj:
    34.     for line in fobj:
    35.         t = datetime.strptime(line[:19],'%Y-%m-%d %H:%M:%S')
    36.         if t > t12 :
    37.             break
    38.         if t >=t9:
    39.             print(line,end='')
    40. 案例二:
    41. # 计算时间差,获取从现在开始前100天,后100
    42. >>> from datetime import datetime,timedelta
    43. >>> t = datetime.now()
    44. >>> dats = timedelta(days=100,hours=1)
    45. >>> t
    46. datetime.datetime(2019, 12, 9, 11, 22, 46, 973981)
    47. >>> t - dats
    48. datetime.datetime(2019, 8, 31, 10, 22, 46, 973981)
    49. >>> t + dats
    50. datetime.datetime(2020, 3, 18, 12, 22, 46, 973981)

    异常处理:

    • - 没有异常处理的代码,当程序遇到错误时,程序将会崩溃,终止执行,在屏幕上打印报错信息

    • - 异常处理是,提前考虑到程序运行过程中将会出现的错误,给出这些错误的解决方案,使得程序不要崩溃,还可以继续执行下去

    1. try:
    2.     num = int(input('number: '))
    3.     result = 100 / num
    4.     print(result)
    5.     print('Done')
    6. except (ValueError, ZeroDivisionError) as e:
    7.     print('无效输入',e)
    8. except (EOFError, KeyboardInterrupt) :
    9.     print('\nBye-Bye')
    10. #0 报错不能作为除数: ZeroDivisionError: division by zero
    11. # asdasd  值不对类型  : ValueError: invalid literal for int() with base 10: 'asdasdasd'
    12. #  Ctrl D 直接结束: EOFError: EOF when reading a line
    13. # >>> asdasdasd  直接Ctrl C----->结果:KeyboardInterrupt
    14. #>>> a = [1 , 2 ]
    15. #>>> a[3]    下标没有这个索引,只有0 1 --->IndexError: list index out of range
    16. #>>> b     还没有定义变量b:   ----->NameError: name 'b' is not defined
    17. try:
    18.     num = int(input('number: '))
    19.     result = 100 / num
    20. except (ValueError, ZeroDivisionError) as e:
    21.     print('无效输入',e)
    22. except (EOFError, KeyboardInterrupt) :
    23.     print('\nBye-Bye')
    24.     exit(1#程序遇到exit将会彻底结束,并且返回1,正确输出
    25. else:
    26.     print(result) #前面的代码正确执行的时候,才执行
    27. finally:
    28.     print('一定要执行的语句')
    29. print('Done')

    触发异常:

    1. def set_age(name,age):
    2.     if not 0 < age < 120:
    3.         raise ValueError('年龄超出正常范围')
    4.     print('%s is %s years old' % (name,age))
    5. if __name__ == '__main__':
    6.     set_age('牛老师',200)
    7. import myerror
    8. #调用上面的函数:
    9. try:
    10.     name = input('名字: ')
    11.     age = int(input('年龄: '))
    12.     myerror.set_age(name,age)
    13. except ValueError :
    14.     print('请输入0~120的年龄')
    15. except (EOFError, KeyboardInterrupt) :
    16.     print('\nBye-Bye')

    断言:

    • 断言是一句必须等价于布尔值为真的判定

    • 此外,发生异常也意味着表达式为假

    1. def set_age(name,age):
    2.     assert 0 < age < 120,'年龄超出正常范围'
    3.     print('%s is %s years old' % (name,age))
    4. if __name__ == '__main__':
    5.     try:
    6.         age = int(input('年龄: '))
    7.         set_age('牛牛',age)
    8.     except (ValueError,AssertionError) as e:
    9.         print('错误:',e)
    10.     except (KeyboardInterrupt,EOFError):
    11.         print('\nBye-Bye')

    OS模块:

    1. import os
    2. os.getcwd()  #pwd
    3. os.listdir()  #ls
    4. os.mkdir('/root/dd')  #mkdir
    5. os.makedirs('/root/dd/ss/ss/ss') #mkdir -p
    6. os.chdir() #cd
    7. os.remove() #rm -rf
    8. os.symlink('/etc/passwd','mimo')  # ln -s
    9. os.chmod('zhuji',0o755) # chmod 755 zhuji
    10. #注意:linux命令chmod使用的进制为 8进制
    11. >>> 0o755
    12. 493
    13. os.chmod('zhuji',493) #十进制
    14. os.stat('zhuji') #文件的详细信息,什么时候被改动或者被访问
    15. #访问时间
    16. #更改change时间:指定内容更改
    17. #更改modify时间:内容以及权限都算在内
    18. >>> os.stat('sss.py')
    19. os.stat_result(st_mode=33188, st_ino=6426766, st_dev=2050, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1575875055, st_mtime=1575875055, st_ctime=1575875055)
    20. >>> import time
    21. >>> time.ctime(1575875055)
    22. 'Mon Dec  9 15:04:15 2019'
    23. >>> sss = os.stat('sss.py')
    24. >>> sss.st_atime
    25. 1575875055.8465357
    26. >>> sss.st_size
    27. 4
    28. 判断:
    29. os.path.isabs('/etc') #是绝对路径吗?
    30. os.path.isdir('/asdf') #/asdf不存在也返回Ture
    31. ---修改一下os.path.isabs('/asdf')
    32. os.path.isfile() #存在并且是文件吗? [ -f fname ]
    33. os.path.ismount() #存在并且是挂载点吗?
    34. os.path.isdir() #存在并且是目录吗? [ -d dname ]
    35. os.path.islink() #存在并且是软链接吗?
    36. os.path.exists() #存在吗? [ -e d/fname ]
    37. >>> path = '/root/nsd1907/py02/day01/sss.txt'
    38. >>> os.path.split(path)
    39. ('/root/nsd1907/py02/day01', 'sss.txt')
    40. >>> os.path.basename(path)
    41. 'sss.txt'
    42. >>> os.path.dirname(path)
    43. '/root/nsd1907/py02/day01'
    44. >>> os.path.join('/root/nsd1907/py02/day01','sss.txt')
    45. '/root/nsd1907/py02/day01/sss.txt'
    46. import shutil
    47. shutil.copy('/etc/hosts','zhuji')#拷贝到当前
    48. shutil.copytree()  #拷贝目录
    案例之遍历linux系统的目录:
    1. # 递归列出目录中所有内容
    2. >>> list(os.walk('anquan'))
    3. [('anquan', ['console.apps', 'console.perms.d', 'limits.d', 'namespace.d'], ['access.conf', 'chroot.conf', 'console.handlers', 'console.perms', 'group.conf', 'limits.conf', 'namespace.conf', 'namespace.init', 'opasswd', 'pam_env.conf', 'sepermit.conf', 'time.conf', 'pwquality.conf']), ('anquan/console.apps', [], ['config-util', 'xserver', 'liveinst', 'setup']), ('anquan/console.perms.d', [], []), ('anquan/limits.d', [], ['20-nproc.conf']), ('anquan/namespace.d', [], [])]
    4. >>> data = list(os.walk('anquan'))   # 列表由5个元组构成
    5. >>> len(data)
    6. 5
    7. # 构成列表的元组有统一的结构:(字符串,列表,列表)
    8. # 进一步观察元组结构:(路径字符串,该路径下目录列表,该路径下文件列表)
    9. >>> data[0]
    10. ('anquan', ['console.apps', 'console.perms.d', 'limits.d', 'namespace.d'], ['access.conf', 'chroot.conf', 'console.handlers', 'console.perms', 'group.conf', 'limits.conf', 'namespace.conf', 'namespace.init', 'opasswd', 'pam_env.conf', 'sepermit.conf', 'time.conf', 'pwquality.conf'])
    11. >>> data[1]
    12. ('anquan/console.apps', [], ['config-util', 'xserver', 'liveinst', 'setup'])
    13. >>> data[2]
    14. ('anquan/console.perms.d', [], [])
    15. # 遍历,打印5行元组
    16. >>> for item in os.walk('anquan'):
    17. ...   print(item)
    18. # 遍历,将元组中的三项分别赋值给3个变量
    19. >>> for path, folders, files in os.walk('anquan'):
    20. ...   print(path, folders, files)
    21. # 遍历,将目录列表和文件列表也逐一遍历出来
    22. >>> for path, folders, files in os.walk('anquan'):
    23. ...   print('%s:' % path)
    24. ...   for mulu in folders:
    25. ...     print(mulu, end='\t')
    26.       print('')
    27. ...   for file in files:
    28. ...     print(file, end='\t')
    29. ...   print('\n')

    pickle模块:

    • 可以将任意的数据类型写到文件,还可以无损地取出

    1. >>> import pickle
    2. >>> shopping_list = ['apple','banana','egg','orange']
    3. #将列表写入文件
    4. >>> with open('/tmp/shopping.data' , 'wb') as fobj :
    5. ...     pickle.dump(shopping_list,fobj)
    6. ...
    7. #在文件中将列表取出
    8. >>> with open('/tmp/shopping.data' , 'rb') as fobj :
    9. ...     alist = pickle.load(fobj)
    10. ...
    11. >>> type(alist)
    12. <class 'list'>
    13. >>> alist
    14. ['apple', 'banana', 'egg', 'orange']
    15. >>>

    案例练习:

    记账程序:

    1. import pickle
    2. import os
    3. from time import strftime
    4. def save(fname):
    5.     '记录收入'
    6.     date = strftime('%Y-%m-%d')
    7.     try:
    8.         amount = int(input('金额: '))
    9.         comment = input('备注: ')
    10.     except ValueError:
    11.         print('输入的金额无效')
    12.         return
    13.     except (KeyboardInterrupt,EOFError):
    14.         print('\nbye')
    15.         exit(1)
    16.     # 在fname文件中取出最新余额,加上当前收入金额,即为最新余额
    17.     with open(fname,'rb') as fobj:
    18.         records = pickle.load(fobj)
    19.     balance = records[-1][-2] + amount
    20.     #将最新记录添加到文件中
    21.     record = [date, amount, 0, balance, comment]
    22.     records.append(record)
    23.     with open(fname,'wb') as fobj:
    24.         pickle.dump(records, fobj)
    25. def cost(fname):
    26.     '记录支出'
    27.     date = strftime('%Y-%m-%d')
    28.     try:
    29.         amount = int(input('金额: '))
    30.         comment = input('备注: ')
    31.     except ValueError:
    32.         print('输入的金额无效')
    33.         return
    34.     except (KeyboardInterrupt,EOFError):
    35.         print('\nbye')
    36.         exit(1)
    37.     # 在fname文件中取出最新余额,减去当前支出金额,即为最新余额
    38.     with open(fname,'rb') as fobj:
    39.         records = pickle.load(fobj)
    40.     balance = records[-1][-2] - amount
    41.     #将最新记录添加到文件中
    42.     record = [date, 0, amount, balance, comment]
    43.     records.append(record)
    44.     with open(fname,'wb') as fobj:
    45.         pickle.dump(records, fobj)
    46. def query(fname):
    47.     '查询'
    48.     #打印表头
    49.     print('%-12s%-8s%-8s%-12s%-20s' % ('date','save','cost','balance','comment'))
    50.     #取出全部记录:
    51.     with open(fname , 'rb') as fobj:
    52.         records = pickle.load(fobj)
    53.     #打印记录
    54.     for record in records:
    55.         print('%-12s%-8s%-8s%-12s%-20s' % tuple(record))
    56. def show_menu():
    57.     cmds = {'0':save,'1':cost,'2':query}
    58.     menu = """(0) 收入
    59. (1) 支出
    60. (2) 查询
    61. (3) 退出
    62. 请选择(0/1/2/3): """
    63.     fname = 'account.data'
    64.     init_data = [
    65.         ['2019-12-10',0,0,10000,'init data']
    66.     ]
    67.     #如果文件不存在,则创建并且写入初始化数据
    68.     if not os.path.exists(fname):
    69.         with open(fname,'wb') as fobj:
    70.             pickle.dump(init_data,fobj)
    71.     while 1:
    72.         try:
    73.             choice = input(menu).strip()
    74.         except (EOFError, KeyboardInterrupt):
    75.             choice = '3'
    76.         # except KeyError:
    77.         #     print('无效输入:')
    78.         #     continue
    79.         # except ValueError:
    80.         #     print('请按照提示数字输入,谢谢')
    81.         if choice not in ['0','1','2','3']:
    82.             print('无效输入,请根据提示数字输入,谢谢')
    83.             continue
    84.         if choice == '3' :
    85.             print('bye-bye')
    86.             break
    87.         cmds[choice](fname)
    88. if __name__ == '__main__':
    89.     show_menu()

  • 相关阅读:
    RHCSA认证考试---12.查找字符串
    OpenSceneGraph3.5.1编译
    [硬件基础]-555定时器-非稳态多谐振荡器配置
    BGP边界网关路由实验(华为)
    怎么做 Redis 容灾
    LeetCode——1455.检查单词是否为句中其他单词的前缀
    konva 系列教程 1:konva 是什么?
    【单调队列】
    开源媒体浏览器Kyoo
    梦想编织者——Adobe Dreamweaver
  • 原文地址:https://blog.csdn.net/zerotoall/article/details/133131493