Python 持久化 - 文件

      網(wǎng)友投稿 783 2022-05-29

      文件

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

      Python 持久化 - 文件

      持久化 - 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) in 10 shv = shelve.open(r'shv,db') 11 try: ---> 12 one = shv['one'] 13 print(one) 14 finally: D:\Anaconda3\lib\shelve.py in __getitem__(self, key) 111 value = self.cache[key] 112 except KeyError: --> 113 f = BytesIO(self.dict[key.encode(self.keyencoding)]) 114 value = Unpickler(f).load() 115 if self.writeback: D:\Anaconda3\lib\dbm\dumb.py in __getitem__(self, key) 151 key = key.encode('utf-8') 152 self._verify_open() --> 153 pos, siz = self._index[key] # may raise KeyError 154 with _io.open(self._datfile, 'rb') as f: 155 f.seek(pos) KeyError: b'one'

      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)容。

      上一篇:華為云ModelArts完整流程引導(dǎo)——貼心的細(xì)致-幫你1小時(shí)完成整個(gè)訓(xùn)練過(guò)程 | 華為云AI賀新年
      下一篇:兩所大學(xué)中的智能車(chē)競(jìng)賽校內(nèi)賽
      相關(guān)文章
      亚洲精品乱码久久久久久按摩 | 亚洲国产精品美女| 亚洲色成人WWW永久网站| 亚洲综合亚洲综合网成人| 亚洲Av无码乱码在线观看性色| 亚洲av日韩精品久久久久久a| 亚洲精品无AMM毛片| 亚洲免费网站观看视频| 亚洲国产欧洲综合997久久| 亚洲色大成网站www永久网站| 亚洲中文字幕久久精品无码VA| 一区二区亚洲精品精华液| 亚洲欧美日韩综合久久久久 | 亚洲成_人网站图片| 亚洲熟女乱色一区二区三区| 亚洲另类无码专区丝袜| 亚洲av无码有乱码在线观看| 337P日本欧洲亚洲大胆精品| 亚洲成AⅤ人影院在线观看| 亚洲国产精品人人做人人爽| 中文字幕第一页亚洲| 国产AV无码专区亚洲A∨毛片| 久久亚洲免费视频| 亚洲今日精彩视频| 亚洲熟妇无码爱v在线观看| 亚洲一区免费视频| 亚洲熟女综合色一区二区三区 | 中文字幕亚洲色图| 亚洲伊人久久精品| 亚洲精品第一国产综合亚AV| 激情无码亚洲一区二区三区| AV在线播放日韩亚洲欧| 亚洲成av人影院| 在线电影你懂的亚洲| 亚洲AV无码成人专区| 亚洲第一综合天堂另类专| 亚洲国产成人久久一区WWW| 亚洲人成网站在线观看播放| 亚洲三级电影网址| 亚洲激情视频图片| 国产精品久久久久久亚洲小说|