Python中對檔案流的操作,以及對json和pickle的理解
阿新 • • 發佈:2018-11-19
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的理解。有疑問或不足的地方歡迎私聊進行探討,謝謝。