程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python學習筆記_Day06

編輯:Python

time模塊

時間的表示方式:

  • 時間戳:1970-1-1 00:00:00到某一時間點之間的秒數
  • UTC時間:世界協調時
  • 9元組: ```python

import time # 時間戳 time.time() 1565141637.870625 # UTC時間 time.ctime() # 返回當前時間 'Wed Aug 7 09:34:59 2019' # 9元組 time.localtime() # 當前時間的9元組,括號中是時間對象擁有的屬性time.struct_time(tm_year=2019, tm_mon=8, tm_mday=7, tm_hour=9, tm_min=35, tm_sec=39, tm_wday=2, tm_yday=219, tm_isdst=0) t1 = time.localtime() t1.tm_year 2019 t1.tm_yday 219

# 睡眠3秒 time.sleep(3)

# 將時間轉換成指定的字符串樣式

time.strftime('%Y-%m-%d %H:%M:%S') '2019-08-07 09:51:28' time.strftime('%a') 'Wed'

# 將時間字符串轉換為 9元組時間對象

time.strptime('2019-08-07 10:17:23', '%Y-%m-%d %H:%M:%S') time.struct_time(tm_year=2019, tm_mon=8, tm_mday=7, tm_hour=10, tm_min=17, tm_sec=23, tm_wday=2, tm_yday=219, tm_isdst=-1) ```

datetime模塊

  • datetime.datetime模塊用於表示時間
  • dateteme.timedelta常用於計算時間差額
>>> from datetime import datetime
>>> from datetime import datetime
>>> t = datetime.now()
>>> t # 括號中是datetime對象的屬性
datetime.datetime(2019, 8, 7, 10, 56, 27, 91802)
>>> t.year, t.month, t.day, t.hour, t.minute, t.second, t.microsecond (2019, 8, 7, 10, 56, 27, 91802)
# 獲取datetime對象相應的時間字符串
>>> t.strftime('%Y-%m-%d %H:%M:%S') '2019-08-07 10:56:27'
# 將時間字符串轉換成datetime對象
>>> datetime.strptime('2019-8-7', '%Y-%m-%d') datetime.datetime(2019, 8, 7, 0, 0)
# 100天3小時之前、之後的時間
>>> from datetime import datetime, timedelta
>>> days = timedelta(days=100, hours=3)
>>> t = datetime.now()
>>> t - days
datetime.datetime(2019, 4, 29, 8, 24, 9, 967534)
>>> t + days
datetime.datetime(2019, 11, 15, 14, 24, 9, 967534)

異常處理

程序報錯了怎麼辦?

沒有異常處理,程序遇到錯誤就崩潰終止執行了。異常處理需要發現問題,並給出解決問題的編碼方案,使得程序 再遇到錯誤時,不會崩潰,仍然能夠向下繼續執行。

異常處理的完整代碼:

try:
有可能發生異常的語句
except 異常1:
處理代碼
except (異常2, 異常3): 處理代碼
... ...
except 異常n:
處理代碼
else:
不發生異常才執行的代碼
finally:
不管是否發生異常都執行的代碼

OS模塊

對文件系統的訪問大多通過python的os模塊實現。

>>> import os
>>> os.getcwd() # pwd '/var/ftp/nsd2019/nsd1903/python02/day01'
>>> os.listdir() # ls
>>> os.listdir('/tmp') # ls /tmp
>>> os.mkdir('/tmp/demo')
>>> os.makedirs('/tmp/aaaa/bbb/ccc') # mkdir -p
>>> os.chdir('/tmp/demo') # cd /tmp/demo
>>> os.listdir() # ls
>>> import shutil
>>> shutil.copy('/etc/passwd', '.')
>>> os.listdir()
>>> os.symlink('/etc/hosts', 'zhuji') # ln -s /etc/hosts zhuji
>>> os.mkdir('abc')
>>> os.listdir() ['passwd', 'zhuji', 'abc']
>>> os.rmdir('abc') # rmdir abc 只能刪除空目錄
>>> os.remove('zhuji') # rm -rf zhuji
>>> os.path.basename('/tmp/demo/abc.txt') # 返回文件名部分
'abc.txt'
>>> os.path.dirname('/tmp/demo/abc.txt') # 返回路徑部分
'/tmp/demo'
>>> os.path.split('/tmp/demo/abc.txt') # 切割
('/tmp/demo', 'abc.txt')
>>> os.path.abspath('.') # 返回當前路徑的絕對路徑
'/tmp/demo'
>>> os.path.abspath('passwd') # 返回當前目錄下文件的絕對路徑
'/tmp/demo/passwd'
>>> os.path.join('/tmp/demo', 'abc.txt') # 拼接路徑
'/tmp/demo/abc.txt'
>>> os.path.isabs('passwd') # 是絕對路徑嗎?
False
>>> os.path.isfile('/etc/hosts') # 存在並且是文件嗎?
True
>>> os.path.ismount('/') # 是掛載點嗎?
True
>>> os.path.isdir('/etc/abcd') # 存在並且是目錄嗎?
False
>>> os.path.islink('/etc/grub2.cfg') # 存在並且是鏈接嗎?
True
>>> os.path.exists('/etc/') # 存在嗎?
True

pickle模塊

它可以將任意數據類型寫入到文件,並且可以無損地取出。

>>> f = open('/tmp/myfil', 'w')
>>> f.write('Hello World.\n') 13
# 常規的文件操作,只能把字符寫入文件,不能寫其他數據類型
>>> f.write(100) # 報錯
>>> f.write({'name': 'tom', 'age': 20}) # 報錯
>>> f.close()
# 使用pickle模塊操作
>>> import pickle
>>> user = {'name': 'tom', 'age': 20} # 將字典寫入文件
>>> with open('/tmp/myfile', 'wb') as f:
... pickle.dump(user, f)
# 在文件中將字典取出
>>> with open('/tmp/myfile', 'rb') as f:
... mydict = pickle.load(f)
>>> mydict
{'name': 'tom', 'age': 20}

練習:記賬程序

  • 假設在記賬時,有一萬元錢
  • 無論是開銷還是收入都要進行記賬
  • 記賬內容包括時間、金額和說明等
  • 記賬數據要求永久存儲
  1. 程序的運作方式
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3): 2
日期 收入 支出 余額 說明
2019-8-7 0 0 10000 初始化
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3): 1
金額:100
備注: 七夕買花
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3): 2
日期 收入 支出 余額 說明
2019-8-7 0 0 10000 初始化
2019-8-7 0 100 9900 七夕買花
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3): 0
金額:10000
備注: 工資
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3): 2
日期 收入 支出 余額 說明
2019-8-7 0 0 10000 初始化
2019-8-7 0 100 9900 七夕買花
2019-8-7 10000 0 19900 工資
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3): 3
Bye-bye
  1. 思考有哪些功能,將功能寫成函數
def save():
def cost():
def query():
def show_menu():
if __name__ == '__main__':
show_menu()
  1. 分析存儲的數據結構
# 將每一行數據保存成一個小列表,所有行存入一個大列表
records = [
['2019-8-7', 0, 0, 10000, 'init'],
['2019-8-7', 0, 100, 9900, 'buy flowers'],
['2019-8-7', 10000, 0, 19900, 'salary'],
]
# 取出最新余額
>>> records[-1][-2]
19900
# 取出時間
>>> import time
>>> time.strftime('%Y-%m-%d')
'2019-08-07'
  1. 填寫函數代碼
import os
from time import strftime
import pickle
def save(fname):
amount = int(input('金額:'))
comment = input('備注:')
date = strftime('%Y-%m-%d')
with open(fname,'rb') as fobj:
records = pickle.load(fobj)
balance = records[-1][-2] + amount
records.append([date,amount,0,balance,comment])
with open(fname,'wb') as fobj:
pickle.dump(records,fobj)
def cost(fname):
amount = int(input('金額:'))
comment = input('備注:')
date = strftime('%Y-%m-%d')
with open(fname, 'rb') as fobj:
records = pickle.load(fobj)
balance = records[-1][-2] - amount
records.append([date, 0, amount, balance, comment])
with open(fname, 'wb') as fobj:
pickle.dump(records, fobj)
def query(fname):
with open(fname,'rb') as fobj:
records = pickle.load(fobj)
print('%-12s%-8s%-8s%-10s%-20s' % ('date','save','cost','balance','comment'))
for record in records:
print('%-12s%-8s%-8s%-10s%-20s' % tuple(record))
def show_menu():
fname = 'account.data
init_data = [[strftime('%Y-%m-%d'),0,0,10000,'init']]
if not os.path.exists(fname):
with open(fname,'wb') as fobj:
pickle.dump(init_data,fobj)
cmds = {'0':save,'1':cost,'2':query}
prompt = '''
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):'''
while True:
choice = input(prompt).strip()
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()
驗證:
$ python 2-1.py
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):2
date save cost balance comment
2019-08-07 0 0 10000 init
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):0
金額:10000
備注:gongzi
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):2
date save cost balance comment
2019-08-07 0 0 10000 init
2019-08-07 10000 0 20000 gongzi
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):1
金額:100
備注:qixi
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):2
date save cost balance comment
2019-08-07 0 0 10000 init
2019-08-07 10000 0 20000 gongzi
2019-08-07 0 100 19900 qixi
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):2
date save cost balance comment
2019-08-07 0 0 10000 init
2019-08-07 10000 0 20000 gongzi
2019-08-07 0 100 19900 qixi
(0) 收入
(1) 支出
(2) 查詢
(3) 退出
請選擇(0/1/2/3):3
Bye-bye

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved