貴德網(wǎng)站建設(shè)公司專業(yè)網(wǎng)站優(yōu)化
一、文件永久存儲(chǔ)
如何將數(shù)據(jù)永久的存放在硬盤上,具體如下。
1.打開文件
定義:往大了講計(jì)算機(jī)系統(tǒng)中由操作系統(tǒng)管理的具有名稱的存儲(chǔ)區(qū)域,往小了講是生活中的PPT、Excel、word三劍客、視頻文件、音頻文件等。
創(chuàng)建打開文件: open()函數(shù)
字符串 含義
‘r’ 讀取(默認(rèn))
‘w’ 寫入(如果文件已存在則先截?cái)嗲蹇瘴募?#xff09;
‘x’ 排他性創(chuàng)建文件(如果文件已存在則打開失敗)
‘a(chǎn)’ 追加(如果文件已存在則在末尾追加內(nèi)容),注1
‘b’ 二進(jìn)制模式,注2
‘t’ 文本模式(默認(rèn)),注3
‘+’ 更新文件(讀取和寫入)
文件對(duì)象的各種方法及含義:
方法 含義
- f.close() 關(guān)閉文件對(duì)象
- f.flush() 將文件對(duì)象中的緩存數(shù)據(jù)寫入到文件中(不一定有效)
- f.read(size=-1, /) 從文件對(duì)象中讀取指定數(shù)量的字符(或者遇到 EOF 停止);當(dāng)未指定該參數(shù),或該參數(shù)為負(fù)值的時(shí)候,讀取剩余的所有字符
- f.readable() 判斷該文件對(duì)象是否支持讀取(如果返回的值為 False,則調(diào)用 read() 方法會(huì)導(dǎo)致 OSError 異常)
- f.readline(size=-1, /) 從文件對(duì)象中讀取一行字符串(包括換行符),如果指定了 size 參數(shù),則表示讀取 size 個(gè)字符
- f.readlines(size=-1, /) 從文件對(duì)象中讀取所有字符串(包括換行符),然后按行為單位存儲(chǔ)到列表中
如果指定了 size 參數(shù),則表示讀取 size 個(gè)字符(如果 size 參數(shù)指定的字符個(gè)數(shù)少于第一行字符個(gè)數(shù),則仍然存放第一行字符,其他行也一樣,它是按 “行” 為單位存儲(chǔ)的) - f.seek(offset, whence=0, /) 修改文件指針的位置,從 whence 參數(shù)指定的位置(0 代表文件起始位置,1 代表當(dāng)前位置,2 代表文件末尾)偏移 offset 個(gè)字節(jié),返回值是新的索引位置
- f.seekable() 判斷該文件對(duì)象是否支持修改文件指針的位置(如果返回的值為 False,則調(diào)用 seek(),tell(),truncate()方法都會(huì)導(dǎo)致 OSError 異常)
- f.tell() 返回當(dāng)前文件指針在文件對(duì)象中的位置
- f.truncate(pos=None, /) 將文件對(duì)象截取到 pos 的位置,默認(rèn)是截取到文件指針當(dāng)前指定的位置
- f.write(text, /) 將字符串寫入到文件對(duì)象中,并返回寫入的字符數(shù)量(字符串的長(zhǎng)度)
- f.writable() 判斷該文件對(duì)象是否支持寫入(如果返回的值為 False,則調(diào)用 write() 方法會(huì)導(dǎo)致 OSError 異常)
- f.writelines(lines, /) 將一系列字符串寫入到文件對(duì)象中(不會(huì)自動(dòng)添加換行符,所以通常是人為地加在每個(gè)字符串的末尾)
例1:
>>> f=open("FishC.txt","w") #存在FishC文件則打開,不存在則創(chuàng)建文件。
>>> f.write("I love Python")
13
>>> f.writelines(["I love FishC.\n","I love my wife."]) # 文件寫內(nèi)容
>>> f.close() # 文件對(duì)象關(guān)閉了,數(shù)據(jù)才能寫入到文件中。執(zhí)行完f.close()后,打開文件,內(nèi)容才能寫入。
>>>
例2:
>>> f=open("FishC.txt","r+") # r+可以讀取和寫入。
>>> f.readable() # 可以讀取
True
>>> f.writable() # 可以寫入
True
>>>
>>> for each in f: # 將文件放到for語句進(jìn)行讀取print(each)I love PythonI love FishC.I love my wife.
# f.read()文件讀取,但沒有內(nèi)容。原因是文件內(nèi)部有個(gè)文件指針,它負(fù)責(zé)指向文件的當(dāng)前位置,當(dāng)在文件中讀取一個(gè)字符的時(shí)候,它這個(gè)文件指針就會(huì)指向下一個(gè)字符,直到文件結(jié)尾。
>>> f.read()
''
>>> f.tell() # 文件末尾的位置
43
>>> f.seek(0) # 修改文件指針,輸入0時(shí),指向開頭。
0
>>> f.readline() #讀取一行
'I love PythonI love FishC.\n'
>>>
>>> f.read() # 讀取到文件的末尾
'I love my wife.'
例3:
>>> f.write("I love my WIFI")
14
>>> f.flush() # 不關(guān)閉文件,將內(nèi)容寫到文件中。
>>>
>>> f.truncate(29) # 截?cái)嗖僮?#xff0c;讀取到29的位置
29
>>> f.close()
>>>
>>> f=open("FishC.txt","w") #打開文件什么都不做,再關(guān)閉,文件是空的。
>>> f.close()
課后題:
1. “在打開一個(gè)文件對(duì)象之后,大多數(shù)的文件操作都是在緩沖區(qū)里面進(jìn)行的。因此,如果希望將文件內(nèi)容保存,我們需要使用 close() 方法關(guān)閉文件對(duì)象,這樣數(shù)據(jù)才能從緩沖區(qū)寫入到文件中?!?#xff0c;那么請(qǐng)問大家,有沒有辦法在不關(guān)閉文件對(duì)象的情況下,進(jìn)行內(nèi)容的保存呢?
答:使用 flush() 方法。
2. 請(qǐng)問如果指定 readline(size=-1) 方法的 size 參數(shù)為 3,那么表示的含義是什么?
答:讀取 3 個(gè)字符。
解析:雖然是 readline() 方法,但如果執(zhí)行 size 參數(shù)的話,那么指定的還是讀取的字符個(gè)數(shù)(而非行數(shù))。
3. 請(qǐng)問下面代碼會(huì)在文件中寫入幾行字符串呢?
>>> f = open("FishC.txt", "w")
>>> f.writelines(["FishA", "FishB", "FishC"])
>>> f.close()
答:一行。
解析:writelines() 方法雖然名字叫 “寫入多行數(shù)據(jù)”,但其實(shí)它并不會(huì)自動(dòng)添加換行符,所以通常我們是需要人為地將換行符加在每個(gè)字符串的末尾。
4. 請(qǐng)問在課堂中的代碼,為什么我們寫入的時(shí)候只有一個(gè)換行符,但是使用 for 語句讀取并打印出來卻多了一個(gè)空白行呢?
>>> f = open("FishC.txt", "w")
>>> f.writelines(["I love FishC.\n", "I love my wife."])
>>> f.close()
>>> f = open("FishC.txt", "r")
>>> for each in f:
... print(each)
...
I love FishC.I love my wife.
答:當(dāng) for 語句作用于文件對(duì)象時(shí),是按行進(jìn)行迭代的,也就是將文件中的每一行內(nèi)容讀取到 each 變量中,這樣理論上打印出來應(yīng)該是兩行,而非三行。
因?yàn)?print() 函數(shù)默認(rèn)是會(huì)在末尾添加一個(gè)換行符,如果將代碼改成下面這樣就不會(huì)了:
>>> for each in f:
... print(each, end='')
...
I love FishC.
I love my wife.
5. 請(qǐng)問下面代碼為什么會(huì)報(bào)錯(cuò)?
>>> f = open("C:\Users\goodb\Desktop\FishC.txt", "w")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
答:因?yàn)槁窂街写嬖谵D(zhuǎn)義字符,導(dǎo)致文件路徑解析錯(cuò)誤。
應(yīng)該這么改:
>>> f = open(r"C:\Users\goodb\Desktop\FishC.txt", "w")
6. 使用 “w” 模式打開文件之前一定要注意什么?
答:一定要注意指定文件是否已存在。
解析:如果該文件已存在并且包含了內(nèi)容,那么使用 “w” 模式打開將直接抹去原有的內(nèi)容,導(dǎo)致原有數(shù)據(jù)丟失(是很可怕的事情)。
7. 如果一個(gè)文件不存在,是否可以使用 “a” 模式將其打開?
答:可以。
解析:
相對(duì)于 “w” 模式來說,“a” 模式會(huì)比較 “溫和”,指定文件如果存在的話,后者不會(huì)導(dǎo)致數(shù)據(jù)丟失,而是使用追加的方式將數(shù)據(jù)寫入文件。
不過注意,不存在說哪一個(gè)模式更優(yōu)秀的說法,因?yàn)閷⒁磺星闆r都考慮在內(nèi),是每一個(gè)優(yōu)秀程序員的職責(zé)所在。
8. 文件指針的作用是什么?
答:指示文件對(duì)象當(dāng)前讀取或者寫入的位置。
9. 什么是 EOF?
答:End Of the File,表示文件末尾的位置。
解析:如果在讀取模式中,當(dāng)文件指針指向 EOF 的時(shí)候,說明文件已經(jīng)全部讀取完畢。
10. 如何知道文件指針當(dāng)前指定的位置?
答:可以使用 tell() 方法來追蹤文件指針的位置。
f.tell() 返回當(dāng)前文件指針在文件對(duì)象中的位置
課后題來自小甲魚python永久存儲(chǔ)(上)