1. 程式人生 > 其它 >Python 學習筆記(五)

Python 學習筆記(五)

1.檢查檔案是否存在

我們經常需要從檔案中讀取資料或向其中寫入資料,但要做到這一點,我們需要檢查檔案是否存在。

import os 
exists = os.path.isfile('/path/to/file')

2.讀取CSV檔案

import csv
csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
    csv_reader = csv.reader(my_data, delimiter=",")
    line_count = 0
    for line in csv_reader:
        if line_count == 0:
            header 
= line else: row_dict = {key: value for key, value in zip(header, line)} csv_mapping_list.append(row_dict) line_count += 1

3.SQLAlchemy

SQLAlchemy是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關係物件對映進行資料庫操作,簡言之便是:將物件轉換成SQL,然後使用資料API執行SQL並獲取執行結果。

關於ORM:

全稱Object Relational Mapping(物件關係對映)。

特點是操縱Python物件而不是SQL查詢,也就是在程式碼層面考慮的是物件,而不是SQL,體現的是一種程式化思維,這樣使得Python程式更加簡潔易讀。

具體的實現方式是將資料庫錶轉換為Python類,其中資料列作為屬性,資料庫操作作為方法。優點是(1)簡潔易讀:將資料表抽象為物件(資料模型),更直觀易讀;(2)可移植:封裝了多種資料庫引擎,面對多個數據庫,操作基本一致,程式碼易維護;(3)更安全:有效避免SQL注入。

4.Flask-RESTful引數解析

Flask-RESTful 內建了支援驗證請求資料,它使用了一個argparse的庫。

from flask.ext.restful import
reqparse
##定義解析器 parser
= reqparse.RequestParser()
##新增規則,如果是必填項,還可以新增 required =true定義是否必填,通過location=['form','args'...]定義作用域 parser.add_argument(
'rate', type=int, help='Rate to charge for this resource')
##引數 args
= parser.parse_args()
##獲取指定的引數
key-name-values = args.get('XXX')

help--定義了報錯時的提示資訊。

5.資料格式化

Flask-RESTful 提供了fields模組和marshal_with()裝飾器。類似 Django ORM 和 WTForm,可以使用 fields 模組來響應中格式化結構。

flask.ext.restful.marshal_with(fields,envelope=None)

A decorator that apply marshalling to the return values of your methods.

主要是解決以下報錯:

TypeError:Object of type XXXX is not JSON serialzable.

匯入模組的方式;

from flask.ext.restful import fields, marshal_with

案例

from collections import OrderedDict
from flask.ext.restful import fields, marshal_with

###一定是字典結構 resource_fields
= { 'task': fields.String, 'uri': fields.Url('todo_ep') } class TodoDao(object): def __init__(self, todo_id, task): self.todo_id = todo_id self.task = task # This field will not be sent in the response self.status = 'active' class Todo(Resource): @marshal_with(resource_fields) def get(self, **kwargs): return TodoDao(todo_id='my_todo', task='Remember the milk')

此外,fields.Nested(),fields.List()也是常用從方法。

6.Python實現多工

程序>執行緒>協程

主程序:執行的時候,預設的程序稱作主程序;子程序,在主程序中可以開啟子程序。

multiprocessing模組提供了類似threading模組的介面,並對程序的各種操作進行了良好的封裝,提供了各種程序間通訊的介面例如Pipe, Queue等等,可以實現程序間的通訊,同步等操作。

import time
from multiprocessing import Process

# 建立子程序
p = Process(target=run, args=("Ail",)) # target程序執行的任務/函式, args傳引數,可選,可迭代(元組)
#啟動程序
p.start()

7.程序ID

import os
os.getpid() ##當前程序ID
os.getppid() ##獲取當前程序的父程序的id

8.全域性變數在多個程序中不能共享

在子程序中修改全域性變數對父程序中的全域性變數沒有影響。因為父程序在建立子程序時對全域性變數做了一個備份,父程序中的全域性變數與子程序的全域性變數完全是不同的兩個變數。全域性變數在多個程序中不能共享。

即:如果是全域性變數,則每個程序都會擁有一份全域性變數,各自操作各自的全域性變數。

9.程序join方法

有時候會需要父程序等待子程序結束再執行父程序後面的程式碼,此時可以考慮使用join()方法。

例子如下:

import time
from multiprocessing import Process
import os

def run():
    print("子程序開啟")
    time.sleep(2)
    print("子程序結束")

if __name__ == "__main__":
    print("父程序啟動")
    p = Process(target=run)
    p.start()
    p.join()  # 等待子程序結束後,再往下執行
    print("父程序結束")

# 輸出結果
父程序啟動
子程序開啟
子程序結束
父程序結束

jion()也可以理解為阻塞主程序,此處後面的程式碼,主程序暫不執行。它可以設定timeout。

10.多程序process的常用方法

(1) start():啟動子程序例項(建立子程序);

(2) is_alive():判斷子程序是否還在活著;如果任務完成,則false;

(3) join([timeout]):是否等待子程序執行結束,或等待多少秒;

(4) terminate():不管任務是否完成,立即終止子程序;

(5)close() :關閉Process物件,釋放與之關聯的所有資源。如果底層程序仍在執行,則會引發ValueError。注意,如果資源釋放後(已呼叫colse()),再執行is_alive()會報錯。

11.程序池

如果要啟動大量的子程序,可以用程序池的方式批量建立子程序。

from multiprocessing.pool import Pool

# 建立多個程序,表示可以同時執行的程序數量。預設大小是CPU的核心數
p = Pool(8)

# 建立程序,放入程序池統一管理
p.apply_async(funcation-name, funcation-args=(???,)) ###非阻塞式;還可以添加回調函式。此外還有一種阻塞式:p.apply()--注意:(1)阻塞式,程序池中一個任務
完成之後,才能開始下一個任務;(2)
這個沒有回撥函式引數。
# 如果我們用的是程序池,在呼叫join()之前必須要先close(),並且在close()之後不能再繼續往程序池新增新的程序(即停止新增任務)
 p.close()
# 程序池物件呼叫join,會等待程序吃中所有的子程序結束完畢再去結束父程序
 p.join()

12.程序間通訊

需要使用到了multiprocessing模組的Queue(佇列)。

from multiprocessing import Process, Queue
q = Queue() ##建立佇列
q.put('??') ##將 obj 放入佇列;還有兩個引數[, block[, timeout]。如果可選引數 block 是True(預設值)而且timeout是None預設值), 將會阻塞當前程序,直到有空的緩衝槽。
q.full()  ##判斷佇列是否已滿;如果佇列是滿的,返回True,反之返回False 。
q.qsize() ##返回佇列的大致長度。由於多執行緒或者多程序的上下文,這個數字是不可靠的。
q.get()  ##從佇列中取出並返回物件。注意:先進先出。可選引數[block[, timeout]];如果可選引數 block 是True(預設值) 而且timeout是None(預設值), 將會阻塞當前程序,直到佇列中出現可用的物件。

參考

1.快速入門 — Flask-SQLAlchemy2.0 documentation

http://www.pythondoc.com/flask-sqlalchemy/quickstart.html

2.Python3多程序multiprocessing模組的使用

https://www.jianshu.com/p/a5f10c152c20

3.multiprocessing--- 基於程序的並行

https://docs.python.org/zh-cn/3.7/library/multiprocessing.html