1. 程式人生 > >Python中對檔案流的操作,以及對json和pickle的理解

Python中對檔案流的操作,以及對json和pickle的理解

1.關於Python對檔案流的操作:

格式:open( 檔名,模式,encoding=‘utf8’,buffering=-1 ) encoding->編碼
buffering->快取,預設-1

本人也是初學者,在Python官網上看到的相關的文件,說的不好還請諒解,指出。

檔案及其組合模式

描述
‘r’ 只讀模式
‘rb’ 只讀模式(針對二進位制檔案)
‘w’ 只寫模式(會覆蓋掉已經有的內容)
‘wb’ 只寫模式(針對二進位制檔案,覆蓋已有內容)
‘a’ 追加模式(向已有的內容後面進行追加)
‘b’ 二進位制模式
‘t’ 文字模式
‘+’ 讀寫模式,構成r+,w+,a+
‘U’ 通用匹配換行符模式

緩衝(buffering),預設為-1

描述
0或False 無緩衝,讀寫操作直接針對磁碟
1或True 有緩衝,只有使用flush或者close時才會寫入磁碟
任意負數 表示預設緩衝區大小

讀和寫

方法名 描述
read([size]) 以字串形式返回資料,可選引數size可以指定讀取的位元組數,如果未指定表示返回全部資料
write(str) 將字串寫入檔案
readline() 以當前位置,從檔案中讀取一行,以字串返回這行資料,offset指向下一行起始位置
readlines([size]) 將檔案返回行為列表(list型別),可選引數size用於指定返回的行數;如果size未指定,表示返回所有行數
writelines() 將一個字串列表一次性寫入到檔案中,不會加換行符

關閉、清空緩衝

方法名 描述
close() 關閉檔案流
flush() 強制寫入磁碟,並清空緩衝區

舉些例子:

 ''' 
 格式:open( 檔名,模式,encoding='utf8',buffering=-1 )  encoding->編碼  
 buffering->快取,預設-1 
 
 返回值:file_object   的檔案物件,它是一個可 iterable 的物件  ,所以可以直接迴圈
 '''
 
'''
1.寫入內容到 'context.txt' 文字
'''

try:
    fo=open( 'context.txt','w',encoding='utf8' )  # 'w'模式會覆蓋原文字,這裡如果使用'w+'或者'a+'模式可以進行追加寫入的內容
    texts=input('請輸入您需要寫入的內容:')
    fo.write( texts+'\n' )     #寫入方法, '\n'自動換行(可以不寫)
except:
    print("讀取異常")
finally:
    fo.flush()              # 強制寫入磁碟,並清空緩衝區
    fo.close()            #關閉檔案流

'''
2.讀取 'context.txt' 文字中的內容
'''

try:
    fo=open( 'context.txt','r+',encoding='utf8' )
    lines=fo.readlines()       #讀取所有內容,返回的的是所有行的內容合起來的list型別
    for line in lines:            #迴圈每行
        print( line )                 #逐行輸出
except:
    print("讀取異常")
finally:
    fo.close()
    
'''
檔案流操作也是可以通過 with 關鍵字來執行的,而且使用with關鍵字不用手動關閉流,
以及手動捕捉異常,因為它內部會自動幫我們關閉流並且處理異常
'''
with open( 'context.txt','r',encoding='utf8' ) as fo:       
    for line in fo.readlines():
        print(  line )
#我的SCDN部落格裡有篇文章有稍微詳細的說 'with' 關鍵字的哦~

輸入:
在這裡插入圖片描述
輸出:

在這裡插入圖片描述

2.json序列化與反序列化操作

首先我們得知道什麼叫序列化和反序列化?:
序列化可以理解為:把python的物件編碼轉換為json格式的字串,反序列化可以理解為:把json格式字串解碼為python資料物件。

json是輕量級的文字格式。 兩種資料型別:
列表:[元素,元素]
字典:{ “鍵”:“值” }

方法名 描述
dumps 把python資料型別序列化為json相應的資料型別格式,操作於記憶體
loads 將json格式資料反序列為Python的相關型別的資料,操作於記憶體
dump 說通俗一點就是序列的是磁碟上的檔案,操作於磁碟
load 反序列磁碟上的檔案,操作於磁碟

舉些例子:

import json

''' 1.dumps() '''
result=json.dumps( ['張三','李四','王五'] )
print(result)
-------------------------------------------------------------------------
["\u5f20\u4e09", "\u674e\u56db", "\u738b\u4e94"]    

'''
在序列化時,中文漢字總是被轉換為unicode碼,
在dumps函式中新增引數ensure_ascii=False即可解決。
'''
result=json.dumps( ['張三','李四','王五'],ensure_ascii=False )
print(result)
-----------------------------------------------------------------------------
["張三", "李四", "王五"]

''' 2.loads()'''
print(  json.loads(  result ) )
-----------------------------------------------------------------------------
["張三", "李四", "王五"]


''' 3.dump() '''
#以上都是將資料序列化到記憶體中,以下要序列化儲存到磁碟上
with open( 'temp.txt,'w' ) as fp:    
    json.dump( [ { 'name':'張三'},{'age':20 } ] ,fp) #序列化後寫入' temp.txt'資料夾

''' 4.load() '''
with open('temp.txt,'r') as fp:
    print(json.load( fp  ))         #將檔案 'temp.txt'檔案反序列化 
 ------------------------------------------------------------------------------
 [{'name': '張三'}, {'age': 20}]

3.pickle 模組 物件序列化

pickle與json不同的地方是:pickle模組是物件序列化,json是對文字格式的序列化

它與json也有同樣的方法:dumps(),loads()和dump(),load()方法,並且用法一致。上面已經有關於json這些方法的應用了,我在這就不多說那些了,就說下它的“物件序列化”。即可以把Python裡面的物件序列化。

import pickle
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        return self.name+' '+str(self.age)

p1=Person( '張三',20 )    #p1現在是一個Person物件
fp=open('Person.txt,'wb')
pickle.dump( p1,fp )   #將p1物件存入' Person.txt ' 中
fp.close()

fp=open( 'Person.txt,'rb' )
pp=pickle.load( fp )    #將' Person.txt ' 中的內容序列化出來得到Person物件
fp.close()
print( pp.show() )   #記得pp是物件,需要呼叫show()方法才能得到相應的值
-------------------------------------------------------------------
張三 20

把Person物件序列化存入’ Person.txt ’ 檔案中的結果為:
在這裡插入圖片描述

——好了,以上就是我對Python中對檔案流的操作,以及對json和pickle的理解。有疑問或不足的地方歡迎私聊進行探討,謝謝。