python學習筆記(二)

来源:http://www.cnblogs.com/lpworkstudyspace1992/archive/2016/11/17/6074895.html
-Advertisement-
Play Games

note eight 使用元類 動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。 程式的調試用logging 模塊 import logging 單元測試 為了編寫單元測試,我們需要引入pytho... ...


note eight
      使用元類
          動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。
          程式的調試用logging 模塊
              import logging
          單元測試
              為了編寫單元測試,我們需要引入python自帶的unittest模塊

      文件讀寫
          讀寫文件是最常見的IO操作,python內置了讀寫文件的函數。讀寫文件就是請求操作系統打開一個文件對象,然後通過操作系統提供的介面從這個文件對象中讀取數據,或者把數據寫入這個文件對象。
          step1:打開文件
              使用python內置的open()函數
          step2:對文件對象進行讀或寫
              read(),write()
          step3:關閉文件
              close(),文件使用完後必須關閉,因為文件對象會占用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的
          但每次都這麼寫實在太繁瑣,所以PYthon引入了with語句來自動幫我們調用close()方法
          with open() as f

          二進位文件
              前面講的預設都是讀取文本文件,並且是ASCII編碼的文本文件。要讀取二進位文件,比如圖片、視頻等等,用"rb"模式打開文件
          字元編碼
              要讀取非ASCII編碼的文本文件,就必須以二進位模式打開,再解碼。如GBK編碼的文件
                   f = open('/Users/michael/gbk.txt', 'rb')
                >>> u = f.read().decode('gbk')
                >>> u
                u'\u6d4b\u8bd5'
                >>> print u
                測試
              如果每次手動轉換嫌麻煩,python還提供了一個codecs模塊幫我們在讀文件時自動轉換編碼,直接讀出unicode
              import codecs
            with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
                f.read() # u'\u6d4b\u8bd5'


    序列化
        在程式運行的過程中,所有的變數都是在記憶體中,可以隨時修改變數,但是一旦程式結束,,變數所占的記憶體就被操作系統全部收回。
        我們把變數從記憶體中變成可存儲或傳輸的過程稱為序列化,在python中叫picking。序列化後,就可以把序列化之後的內容寫入磁碟,或通過網路傳輸到別的機器上。
        反過來,把變數內容從序列化的對象重新讀到記憶體里稱為反序列化。
        python提供兩個模塊來實現序列化
            cPickle, pickle

        導入模塊
        : d
        Out[11]: {'age': 20, 'name': 'Jack', 'score': 88}

        In [12]: try :
           ....:     import cPickle as pickle
           ....: except ImportError:
           ....:     import pickle
           ....:

        In [13]: pickle.dumps(d)
        Out[13]: "(dp1\nS'age'\np2\nI20\nsS'score'\np3\nI88\nsS'name'\np4\nS'Jack'\np5\ns."
        pickle.dumps()方法把任意對象序列化成一個str,然後就可以把這個str寫入文件、或者用另一個方法pickle.dump()直接把對象序列化後寫入一個file-like Object

            In [15]: f= open(r"C:\Users\MyHome\Desktop\dumps.txt","wb")

            In [16]: pickle.dump(d,f)

            In [17]: f.close()
        當我們要把對象從磁碟讀到記憶體時,可以先把內容讀到一個str,然後用pickle.loads()方法反序列化對象,也可以直接用pickle.load()方法從一個file-like Object 中直接反序列化對象。
       
        In [18]: f= open(r"C:\Users\MyHome\Desktop\dumps.txt","rb")

        In [19]: d = pickle.load(f)

        In [20]: f.close()

        In [21]: d
        Out[21]: {'age': 20, 'name': 'Jack', 'score': 88}

    JSON進階
        如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字元串,可以被所有語言讀取,也可以方便地存儲到磁碟或者通過網路傳輸。JSON不僅是標準格式,並且比XML更快,而且可以直接在Web頁面中讀取,非常方便。
        python中內置的json模塊提供了非常完善的Python對象到JSON格式的轉換。我們先看看如何把python對象變成一個JSON

 

            In [22]: import json

            In [23]: d = dict(name = "Jack",age = 24,score = 96)

            In [24]: json.dumps(d)
            Out[24]: '{"age": 24, "score": 96, "name": "Jack"}'

            dumps()方法返回一個str,內容就是標準的JSON,類似的,dump()方法可以直接把JSON寫入一個file-like Object
            要把JSON反序列化為python對象,用loads()或者對應的load()方法,前者把JSON的字元串反序列化,後者從file-like Object 中讀取字元串並反序列化
            In [25]: json_str =  '{"age": 24, "score": 96, "name": "Jack"}'

            In [26]: json.loads(json_str)
            Out[26]: {u'age': 24, u'name': u'Jack', u'score': 96}


        Python的dict對象可以直接序列化為JSON的{},不過,很多時候,我們更喜歡用class表示對象,比如定義Student類,然後序列化:

            import json

            class Student(object):
                def __init__(self, name, age, score):
                    self.name = name
                    self.age = age
                    self.score = score

            s = Student('Bob', 20, 88)
            print(json.dumps(s))
            運行代碼,毫不留情地得到一個TypeError:

            Traceback (most recent call last):
              ...
            TypeError: <__main__.Student object at 0x

        錯誤的原因是Student對象不是一個可序列化為JSON的對象。

    如果連class的實例對象都無法序列化為JSON,這肯定不合理!

    別急,我們仔細看看dumps()方法的參數列表,可以發現,除了第一個必須的obj參數外,dumps()方法還提供了一大堆的可選參數:

    https://docs.python.org/2/library/json.html#json.dumps

    這些可選參數就是讓我們來定製JSON序列化。前面的代碼之所以無法把Student類實例序列化為JSON,是因為預設情況下,dumps()方法不知道如何將Student實例變為一個JSON的{}對象。

    可選參數default就是把任意一個對象變成一個可序列為JSON的對象,我們只需要為Student專門寫一個轉換函數,再把函數傳進去即可:


        def studentdict(std):
            return {"name":std.name,"age":std.age,"score":std.score}

        print (json.dumps(s,default=studentdict))

    不過,下次如果遇到一個Teacher類的實例,照樣無法序列化為JSON。我們可以偷個懶,把任意class的實例變為dict:

        print(json.dumps(s, default=lambda obj: obj.__dict__))


    同樣的道理,如果我們要把JSON反序列化為一個Student對象實例,loads()方法首先轉換出一個dict對象,然後,我們傳入的object_hook函數負責把dict轉換為Student實例:

        def dict2student(d):
            return Student(d['name'], d['age'], d['score'])

        json_str = '{"age": 20, "score": 88, "name": "Bob"}'
        print(json.loads(json_str, object_hook=dict2student))
        運行結果如下:

        <__main__.Student object at 0x10cd3c190>
    列印出的是反序列化的Student實例對象。


    解析
        如果我們要編寫一個搜索引擎,第一步是用爬蟲把目標網站的頁面抓取下來,第二部就是解析該HTML頁面,看看裡面的內容到底是新聞、圖片還是視頻。
        如何解析HTML呢,python提供了HTMLParser來非常方便地解析HTML


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 包裝類 基本類型 包裝類 + byte Byte + short Short + int Integer + long Long + char Character + float Float + double Double + boolean Boolean 基本類型轉為包裝類型: + 自動裝箱Au ...
  • byte tt=(byte)130 等於 -126 。 byte 占一個位元組,8bit 。第一位是符號位,0 表示正數,1 表示負數。因此byte 的取值範圍 [-128, 127] 。 130的二進位是00000000000000000000000010000010,截取成byte類型只保留後8位 ...
  • Django開髮網站需要遵循Django的一套開發流程。本節通過建立一個消息錄入頁面演示Django的開發流程及相關技術。 ...
  • 1 問題描述 利用Java EE相關技術實現一個簡單的Web聊天室系統,具體要求如下。 (1)編寫一個登錄頁面,登錄信息中有用戶名和密碼,分別用兩個按鈕來提交和重置登錄信息。 (2)編寫一個Servlet程式Main.java通過請求指派來處理用戶提交的登錄信息,如果用戶名為本小組成員的名字且密碼為 ...
  • python flask+gunicorn+nginx部署應用 ...
  • 1.添加Python群組 運行EditPlus,選擇工具→配置用戶工具進入參數設置框。 單擊添加工具→應用程式。菜單文字輸入python,命令為Python的安裝路徑,參數輸入 $(FileName),初始目錄輸入 $(FileDir),動作選擇 捕捉輸出。然後點擊確定。 2.設置Python高亮和 ...
  • 1. 在https://www.python.org/downloads/release/python-352/網站上下載python版本 2. 配置環境 右擊電腦屬性,然後選擇高級系統設置 3. 選擇環境變數,配置Path 輸入;C:\Users\小紅\AppData\Roaming\Micro ...
  • 兩者區別與作用: 普通任務:總調度(SchedulerFactoryBean)--> 定時調度器(CronTriggerFactoryBean) --> 調度明細自定義執行方法bean(MethodInvokingJobDetailFactoryBean) -->調度bean(我們定義的job類) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...