Head First Python 讀書筆記(四)

2022-04-29 10:42:11 字數 4103 閱讀 6386

開啟,處理,關閉檔案

模式引數

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_loghtml**:

}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 在某些語法上...