天天看點

Python自動化開發學習4-3

JSON 和 pickle

序列化:把資料對象變成字元串的形式,這樣可以儲存在檔案中。反之就是反序列化

python自帶的str()可以完成序列化,然後eval()可以反序列化,但是我們先把他們忘記。不知道适用範圍是多大。

我們用json的規範來做序列化和反序列化。

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>import</code> <code>json</code>

<code>dica </code><code>=</code> <code>{</code><code>'name'</code><code>:</code><code>'Alice'</code><code>,</code>

<code>        </code><code>'age'</code><code>:</code><code>18</code><code>,</code>

<code>        </code><code>'from'</code><code>:</code><code>'ShangHai'</code>

<code>        </code><code>}</code>

<code>stra </code><code>=</code> <code>json.dumps(dica)  </code><code># 序列化</code>

<code>print</code><code>(</code><code>type</code><code>(stra),stra)</code>

<code>dica2 </code><code>=</code> <code>json.loads(stra)  </code><code># 反序列化</code>

<code>print</code><code>(</code><code>type</code><code>(dica2),dica2)</code>

<code>strb </code><code>=</code> <code>'{"name":"Jack","age":22,"from":"BeiJing"}'</code>  <code># JSON隻認雙引号,是以字元串内部要雙引号</code>

<code>print</code><code>(</code><code>type</code><code>(strb),strb)</code>

<code>dicb </code><code>=</code> <code>json.loads(strb)  </code><code># 反序列化</code>

<code>print</code><code>(</code><code>type</code><code>(dicb),dicb)</code>

一種需求是序列化成字元串之後存入檔案儲存起來。下次要用的時候再讀取檔案,反序列化生成之前的資料。對于這種情況,對應有兩個便捷的方法可以直接完成。

<code>with </code><code>open</code><code>(</code><code>"testjson.txt"</code><code>,</code><code>'w'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>) as </code><code>file</code><code>:</code>

<code>    </code><code>json.dump(dica,</code><code>file</code><code>)</code>

可以去檢視一下,運作目錄下是否生成了一個檔案。然後再來反序列化

<code>with </code><code>open</code><code>(</code><code>"testjson.txt"</code><code>,</code><code>'r'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>) as </code><code>file</code><code>:</code>

<code>    </code><code>data </code><code>=</code> <code>json.load(</code><code>file</code><code>)</code>

<code>print</code><code>(</code><code>type</code><code>(data),data)</code>

上面的JSON的序列化并不支援python所有的資料類型。但是JSON是通用的規範,也就是JSON序列化之後的資料到其他語言環境也能識别。

對于不支援的資料類型,應該可以加一步編解碼,但是如果别的語言環境也不支援這個資料類型,那麼即使能序列化也沒有用。

不過python序列化儲存之後再給python反序列化使用,就沒有資料類型的問題,那麼可以使用pickle。

python的pickle子產品實作了python的所有資料序列和反序列化。基本上功能使用和JSON子產品沒有太大差別,方法也同樣是dumps/dump和loads/load

<code>import</code> <code>pickle</code>

<code>stra </code><code>=</code> <code>pickle.dumps(dica)  </code><code># 序列化</code>

<code>print</code><code>(</code><code>type</code><code>(stra),stra)  </code><code># 這裡bytes類型了,隻有二進制類型才有可能把所有的資料類型都序列化</code>

<code>dica2 </code><code>=</code> <code>pickle.loads(stra)  </code><code># 反序列化</code>

軟體目錄開發規範

假設項目名稱是Foo,項目名稱的首字母大寫。下面是一個簡單的目錄結構:

Foo/

|-- bin/

|   |-- foo

|

|-- foo/

|   |-- tests/

|   |   |-- __init__.py

|   |   |-- test_main.py

|   |

|   |-- __init__.py

|   |-- main.py

|-- docs/

|   |-- conf.py

|   |-- abc.rst

|-- setup.py

|-- requirements.txt

|-- README

bin/: 存放項目的一些可執行檔案,當然你可以起名<code>script/</code>之類的也行。

<code>foo/</code>: 存放項目的所有源代碼。(1) 源代碼中的所有子產品、包都應該放在此目錄。不要置于頂層目錄。(2) 其子目錄<code>tests/</code>存放單元測試代碼; (3) 程式的入口最好命名為<code>main.py</code>。

<code>docs/</code>: 存放一些文檔。

<code>setup.py</code>: 安裝、部署、打包的腳本。

<code>requirements.txt</code>: 存放軟體依賴的外部Python包清單。

<code>README</code>: 項目說明檔案。

不同目錄間進行子產品調用

python裡一個檔案夾下如果有一個__init__.py的空檔案,這就不是一個普通的檔案夾了,這是一個包。

要調用包裡的子產品,可以使用:from 包名 import 子產品名

要能夠調用,還要先保證包的上級目錄在環境變量裡。要動态的擷取到程式的目錄和上級目錄,并且導入環境變量,看下面的例子:

<code>import</code> <code>os,sys</code>

<code>print</code><code>(__file__)  </code><code># 列印相對路徑</code>

<code>print</code><code>(os.path.abspath(__file__))  </code><code># 列印絕對路徑</code>

<code>print</code><code>(os.path.dirname(os.path.abspath(__file__)))  </code><code># 列印上一級目錄,這裡是去掉了檔案名</code>

<code>print</code><code>(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  </code><code># 列印再上一級目錄</code>

<code>BASE_DIR </code><code>=</code> <code>os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  </code><code># 隻要這句,上面都不要</code>

<code>print</code><code>(sys.path)  </code><code># 列印目前的環境變量</code>

<code>sys.path.append(BASE_DIR)  </code><code># 添加環境變量,這句也要。</code>

<code>print</code><code>(sys.path)  </code><code># 看看現在的環境變量是否有增加</code>

實際使用時,我們隻需要上面的2句就可以了。

作業

員工資訊表:

staff_id

name

age

phone

dept

enroll_date

Adam Liu

25

13562984561

IT

2013-04-01

Barry Allen

22

13659874522

HR

2015-05-03

Clark Kent

30

13156998456

Sales

2016-04-22

Eddie Thawne

40

13566942130

2009-03-01

不過這個表可能是這樣存在你的檔案裡的:

1,Adam Liu,25,13562984561,IT,2013-04-01

現需要對這個員工資訊檔案,實作增删改查操作

一、可進行模糊查詢,文法至少支援下面3種:

  select name,age from staff_table where age &gt; 22

  select  * from staff_table where dept = "IT"

      select  * from staff_table where enroll_date like "2013"

查到的資訊,列印後,最後面還要顯示查到的條數 

二、可建立新員工紀錄,以phone做唯一鍵,staff_id需自增

三、可删除指定員工資訊紀錄,輸入員工id,即可删除

四、可修改員工資訊,文法如下:

  update staff_table set dept="Market" where dept = "IT"

注意:以上内容要充分使用函數,最大限度減少重複代碼。

<b></b>

<b>本文轉自騎士救兵51CTO部落格,原文連結:http://blog.51cto.com/steed/1981308</b><b>,如需轉載請自行聯系原作者</b>