開啟,處理,關閉檔案
模式引數
with
語句
tasks = open('todos.txt')
for ch in tasks:
print(ch, end='')
tasks.close()
# 使用with語句
with
open('todos.txt') as tasks:
for ch in tasks:
print(ch, end='')
使用了with
語句,可以不用考慮呼叫close()
方法,充當著管理上下文的作用。符合上下文管理協議
的約定。
日誌記錄
結合筆記三做的web應用,現在需要記錄其web請求的詳細資訊和結果。
# req:是當前flask請求物件 res:查詢結果
- 當然可以在網頁中去檢視,這就要增加乙個url:/viewlog
,去讀取日誌檔案裡面儲存的資料顯示在瀏覽器中
defview_log
()->str:
with open('vsearch.log') as log:
contents = log.read() # 一次性讀取整個檔案
轉義資料
根據上面的結果,發現:網頁顯示的和日誌檔案不一樣;那是因為瀏覽器會自動把一些標記隱藏。可以使用escape
函式去轉義,對從日誌檔案讀取出來的內容轉義
>>>
from flask import escape
>>> escape('this is a request')
markup('this is a request')
>>> escape('this is a ')
markup('this is a ')
def
view_log
()->str:
with open('vsearch.log') as log:
contents = log.read()
return escape(contents)
就算在網頁上面顯示了web請求物件,但是目前來說,這些請求物件都是一樣的,要檢視請求物件的內部,可以使用dir
內建方法,檢視它的方法和屬性列表。
記錄特定的web請求屬性
一般來說,有三個屬性是日誌記錄比較重要的:
修改我們的日誌記錄函式:
def
log_request
(req: 'flask_request', res: str)->none:
with open('vsearch.log', 'a') as log:
print(req.form, file=log)
print(req.remote_addr, file=log)
print(req.user_agent, file=log)
print(res, file=log)
最後日誌記錄的結果是這樣的:
immutablemultidict([('phrase', 'this is my first python'), ('letters', 'aeiou')]) # 提交的資料
127.0
.0.1
# ip位址
.3396
.99 safari/537.36
# 瀏覽器版本
# 查詢結果
這樣雖然記錄了一次web請求的比較關鍵的資訊,但是卻要從日誌檔案裡面讀取4次,應該想能不能一次web請求,記錄一行資料,然後讀取一次呢?
def
log_request
(req: 'flask_request', res: str)->none:
with open('vsearch.log', 'a') as log:
print(req.form, file=log, end='|')
print(req.remote_addr, file=log, end='|')
print(req.user_agent, file=log, end='|')
print(res, file=log)
可讀的輸出>>> names=['terry','john','michael']
>>> pythons = '|'.join(names)
>>> pythons
'terry|john|michael'
>>> s =pythons.split('|')
>>> s
['terry', 'john', 'michael']
# 列表的巢狀 contents 就資料讀入巢狀列表裡面
defview_log
()->str:
contents = # 空列表
with open('vsearch.log') as log:
for line in log:
for item in line.split('|'): # 根據 | 分解一行資料
return str(contents)
# 希望再 the_row_titles 變數中查詢資料
}th>
}# 迴圈結尾
tr>
使用html的**標記
,格式化輸出日誌資料,接著修改view_log
函式,使得其向瀏覽器返回乙個html
而不是字串
defview_log
()->'html':
contents =
with open('vsearch.log') as log:
for line in log:
for item in line.split('|'):
titles=('form data','remote_addr','user_agent','results')
return render_template('viewlog.html',the_title='view log',the_row_titles=titles,the_data=contents,)
修改後的view_log
的html
**:
}h2>
}th>
tr>
}td>
tr>
table>
格式化輸出效果:
Head First Python(定製資料物件)
新的檔案格式 sarah sweeney,2002 6 17,2 58,2.58,2 39,2 25,2 55,2 54,2.18,2 55,2 55,2 22,2 21,2.22 如果使用split bif把資料抽取到乙個列表,第乙個資料項是名字,然後是出生日期,然後是計時資料。sarah get...
Head First Python 讀書筆記
idle整合開發環境 in 操作符 檢查乙個物件是否在另乙個物件中 不用大括號分開,靠縮排 區分 作為乙個 塊,有 的地方,必須縮排 迭代處理乙個物件序列的三種典型方法 序列是乙個有序的物件集合 for迴圈 知道迴圈次數 迴圈數字列表,迭代變數 x 指的是被迭代物件中的item for x in 1...
HeadFirstPython 資料持久化
usr bin env python coding utf 8 這一章主要是講如何將資料進行持久化。使用pickle對資料進行醃製。在對資料進行醃製之前,我們需要對資料進行格式化 針對資料 取出我們想要的資料。在中間的知識點是 檔案開啟與關閉,以及其異常處理。我用的是python2.7 在某些語法上...