Python 持久化 - 文件
文件
長(zhǎng)久保存信息的一種數(shù)據(jù)信息集合
常用操作
打開(kāi)關(guān)閉(文件一旦打開(kāi),需要關(guān)閉操作)
讀寫(xiě)內(nèi)容
查找
open 函數(shù)
open 函數(shù)負(fù)責(zé)打開(kāi)文件,帶有很多參數(shù)
第一個(gè)參數(shù):必須有,文件的路徑和名稱
mode:表明文件用什么方式打開(kāi)
r:以只讀方式打開(kāi)
w:寫(xiě)方式打開(kāi),會(huì)覆蓋以前的內(nèi)容
x:創(chuàng)建方式打開(kāi),如文件已經(jīng)存在,報(bào)錯(cuò)
a:append 方式,以追加的方式對(duì)文件內(nèi)容進(jìn)行寫(xiě)入
b:binary 方式,二進(jìn)制方式寫(xiě)入
t:文本方式打開(kāi)
+;可讀寫(xiě)
# 打開(kāi)文件,用寫(xiě)的方式 # r 表示后面字符串內(nèi)容不需要轉(zhuǎn)義 # f 稱之為文件句柄 f = open(r"test01.txt", 'w') # 文件打開(kāi)后必須關(guān)閉 f.close() # 此案例說(shuō)明,以寫(xiě)方式打開(kāi)文件,默認(rèn)是如果沒(méi)有文件,則創(chuàng)建
1
2
3
4
5
6
7
8
with 語(yǔ)句
with 語(yǔ)句使用的技術(shù)是一種稱為上下文管理協(xié)議的技術(shù)(ContextManagementProtocol)
自動(dòng)判斷文件的作用域,自動(dòng)關(guān)閉不再使用的打開(kāi)的文件句柄
# with 語(yǔ)句案例 with open(r"test01.txt", 'r') as f: pass # 下面語(yǔ)句塊開(kāi)始對(duì)文件f進(jìn)行操作 # 在本模塊中不需要再使用close關(guān)閉文件f
1
2
3
4
5
6
# with 案例 with open(r"test01.txt", 'r') as f: # 按行讀取內(nèi)容 strline = f.readline() # 此結(jié)構(gòu)保證能夠完整讀取文件直到結(jié)束 while strline: print(strline) strline = f.readline()
1
2
3
4
5
6
7
8
9
假若他日相逢, 我將何以賀你? 以眼淚, 以沉默。
1
2
3
4
5
6
7
# list 能用打開(kāi)的文件作為參數(shù),把文件內(nèi)每一行內(nèi)容作為一個(gè)元素 with open(r"test01.txt", 'r') as f: # 以打開(kāi)的文件f作為參數(shù),創(chuàng)建列表 l = list(f) for line in l: print(line)
1
2
3
4
5
6
7
假若他日相逢, 我將何以賀你? 以眼淚, 以沉默。
1
2
3
4
5
6
7
# read 是按字符讀取文件內(nèi)容 # 允許輸入?yún)?shù)決定讀取幾個(gè)字符,如果沒(méi)有指定,從當(dāng)前位置讀取到結(jié)尾 # 否則,從當(dāng)前位置讀取指定個(gè)數(shù)字符 with open(r"test01.txt", 'r') as f: strChar = f.read(1) print(len(strChar)) print(strChar)
1
2
3
4
5
6
7
8
1 假
1
2
seek (offset, from)
移動(dòng)文件的讀取位置,也叫讀取指針
from 的取值范圍:
0:從文件頭開(kāi)始偏移
1:從文件當(dāng)前位置開(kāi)始偏移
2:從文件末尾開(kāi)始偏移
移動(dòng)的單位是字節(jié)(byte)
一個(gè)漢字由若干個(gè)字節(jié)構(gòu)成
返回文件只針對(duì)當(dāng)前位置
# seek 案例 # 打開(kāi)文件后,從第5個(gè)字節(jié)處開(kāi)始讀取 # 打開(kāi)讀寫(xiě)指針在0處,即文件的開(kāi)頭 with open(r"test01.txt", 'r') as f: # seek 移動(dòng)單位是字節(jié) f.seek(4, 0) strChar = f.read() print(strChar)
1
2
3
4
5
6
7
8
9
他日相逢, 我將何以賀你? 以眼淚, 以沉默。
1
2
3
4
# 關(guān)于讀取文件的練習(xí) # 打開(kāi)文件,三個(gè)字符一組讀出內(nèi)容,然后顯示在屏幕上 # 每讀一次,休息一秒鐘 # 讓程序暫停,可以使用time下的sleep函數(shù) import time with open(r"test01.txt", 'r') as f: # read 參數(shù)的單位是字符,可以理解成一個(gè)漢字就是一個(gè)字符 strChar = f.read(3) while strChar: print(strChar) # sleep 參數(shù)單位是秒 time.sleep(1) strChar = f.read(3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
假若他 日相逢 , 我 將何以 賀你? 以眼 淚, 以沉默 。
1
2
3
4
5
6
7
8
9
10
11
12
# tell 函數(shù):用來(lái)顯示文件讀取指針的當(dāng)前位置 with open(r"test01.txt", 'r') as f: strChar = f.read(3) pos = f.tell() while strChar: print(pos) print(strChar) strChar = f.read(3) pos = f.tell() # 一下結(jié)果說(shuō)明: # tell 的返回?cái)?shù)字的單位是 byte # read 是以字節(jié)為單位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
6 假若他 12 日相逢 18 , 我 24 將何以 30 賀你? 36 以眼 42 淚, 48 以沉默 50 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
文件的寫(xiě)操作 - write
write(str):把字符串寫(xiě)入文件
writeline(str):把字符串按行寫(xiě)入文件
區(qū)別:
write 函數(shù)參數(shù)只能是字符串
writeline 函數(shù)參數(shù)可以是字符串,也可以是字符串序列
# write 案例 # 1. 向文件追加一行詩(shī) # a 代表追加方式打開(kāi) with open(r"test01.txt", 'a') as f: # 注意字符串內(nèi)含有換行符 f.write("生活不止眼前的茍且,\n 還有遠(yuǎn)方的茍且")
1
2
3
4
5
6
7
# 可以直接寫(xiě)入行,用writelines # writelines 表示寫(xiě)入很多行,參數(shù)可以是list形式 with open(r"test01.txt", 'a') as f: # 注意字符串內(nèi)含有換行符 f.writelines("生活不止眼前的茍且") f.writelines("還有遠(yuǎn)方的枸杞")
1
2
3
4
5
6
help(f.writelines)
1
Help on built-in function writelines: writelines(lines, /) method of _io.TextIOWrapper instance
1
2
3
l = ["I", "love", "you"] with open(r"test01.txt", 'w') as f: # 注意字符串內(nèi)含有換行符 f.writelines(l)
1
2
3
4
持久化 - pickle
序列化(持久化,落地):把程序運(yùn)行中的信息保存在磁盤(pán)上
反序列化:序列化的逆過(guò)程
pickle:python 提供的序列化模塊
pickle.dump:序列化
pickle.load:反序列化
# 序列化案例 import pickle age = 19 with open(r"test01.txt", 'wb') as f: pickle.dump(age, f)
1
2
3
4
5
6
7
# 反序列化案例 import pickle with open(r"test01.txt", 'rb') as f: age = pickle.load(f) print(age)
1
2
3
4
5
6
7
19
1
# 序列化案例 import pickle a = [19, 'ruochen', 'i love you', [175, 51]] with open(r"test01.txt", 'wb') as f: pickle.dump(a, f)
1
2
3
4
5
6
7
with open(r"test01.txt", 'rb') as f: a = pickle.load(f) print(a)
1
2
3
[19, 'ruochen', 'i love you', [175, 51]]
1
持久化 - shelve
持久化工具
類似字典,用kv對(duì)保存數(shù)據(jù),存取方式跟字典也類似
open,close
# 使用shelve創(chuàng)建文件并使用 import shelve # 打開(kāi)文件 # shv相當(dāng)于一個(gè)字典 shv = shelve.open(r"shv.db") shv['one'] = 1 shv['two'] = 2 shv['three'] = 3 shv.close() # 通過(guò)以上案例發(fā)現(xiàn),shelve 自動(dòng)創(chuàng)建的不僅僅是一個(gè)shv.db 文件,還包括其他格式文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# shelve 讀取案例 shv = shelve.open(r'shv.db') try: print(shv['one']) print(shv['threee']) except Exception as e: print("1") finally: shv.close()
1
2
3
4
5
6
7
8
9
10
11
1 1
1
2
shelve 特性
不支持多個(gè)應(yīng)用并行寫(xiě)入
為了解決這個(gè)問(wèn)題,open 的時(shí)候可以使用 flag=r
寫(xiě)回問(wèn)題
shelve 默認(rèn)情況下不會(huì)等待持久化對(duì)象進(jìn)行任何修改
解決方法:強(qiáng)制寫(xiě)回:writeback=True
# shelve 之只讀打開(kāi) import shelve shv = shelve.open(r'shv.db', flag='r') try: k1 = shv['one'] print(k1) finally: shv.close()
1
2
3
4
5
6
7
8
9
10
1
1
import shelve shv = shelve.open(r'shv.db') try: shv['one'] = {"eins":1, "zwei":2, "drei":3} finally: shv.close() shv = shelve.open(r'shv,db') try: one = shv['one'] print(one) finally: shv.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) D:\Anaconda3\lib\shelve.py in __getitem__(self, key) 110 try: --> 111 value = self.cache[key] 112 except KeyError: KeyError: 'one' During handling of the above exception, another exception occurred: KeyError Traceback (most recent call last)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# shelve 忘記寫(xiě)回,需要使用強(qiáng)制寫(xiě)回 shv = shelve.open(r"shv.db") try: k1 = shv['one'] print(k1) # 此時(shí),一旦shelve關(guān)閉,則內(nèi)容還是存在于內(nèi)存中,沒(méi)有寫(xiě)回?cái)?shù)據(jù)庫(kù) k1["eins"] = 100 finally: shv.close() shv = shelve.open(r"shv.db") try: k1 = shv['one'] print(k1) finally: shv.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{'eins': 1, 'zwei': 2, 'drei': 3} {'eins': 1, 'zwei': 2, 'drei': 3}
1
2
# shelve 忘記寫(xiě)回,需要使用強(qiáng)制寫(xiě)回 shv = shelve.open(r"shv.db", writeback=True) try: k1 = shv['one'] print(k1) # 此時(shí),一旦shelve關(guān)閉,則內(nèi)容還是存在于內(nèi)存中,沒(méi)有寫(xiě)回?cái)?shù)據(jù)庫(kù) k1["eins"] = 100 finally: shv.close() shv = shelve.open(r"shv.db") try: k1 = shv['one'] print(k1) finally: shv.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{'eins': 1, 'zwei': 2, 'drei': 3} {'eins': 100, 'zwei': 2, 'drei': 3}
1
2
# shelve 使用with管理上下文環(huán)境 with shelve.open(r'shv.db', writeback=True) as shv: k1 = shv['one'] print(k1) k1['eins'] = 1000 with shelve.open(r"shv.db") as shv: print(shv['one'])
1
2
3
4
5
6
7
8
9
{'eins': 100, 'zwei': 2, 'drei': 3} {'eins': 1000, 'zwei': 2, 'drei': 3}
1
2
Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。