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 > 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>