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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...