1. 程式人生 > 實用技巧 >推薦一些好用的查題方法

推薦一些好用的查題方法

一,初識檔案操作。
引子:

現在這個世界上,如果可以操作檔案的所有軟體都消失了,比如word,wps等等,此時你的朋友通過qq給你發過來一個檔案,檔名是:美女模特空姐護士聯絡方式.txt,在座的所有男同學,那麼你接受到這個檔案之後,你的內心是否有一絲衝動,當然咱們不是那種悶騷的人,其實我們就是比較好奇,就是想要看看裡面寫的是什麼,僅此而已,絕不聯絡。但是我說了所有可以操作檔案的軟體全部都沒了,那麼你是不是百爪撓心,火急火燎,哎呀。別急呀,你忘了麼?你學過Python這門程式語言,這個語言肯定有能操控檔案的功能。我相信在這種強大的動力下,你是可以,必須能學會的。

那麼假設,現在讓你用Python開發一個軟體來操作這個檔案,你覺得你需要什麼必要引數呢?

  檔案路徑:D:\美女模特空姐護士聯絡方式.txt  (你想操作這個檔案,必須要知道這個檔案的位置)

  編碼方式:utf-8,gbk,gb2312....  (昨天剛講完編碼,檔案其實就是資料的儲存,資料儲存你需要編碼知道這個資料是以什麼編碼儲存的)

  操作模式:只讀,只寫,追加,寫讀,讀寫....

檔案操作的內容流程
此時你需要先利用軟體建立一個檔案,檔案裡面隨便寫一些內容,然後儲存在任意磁碟(路徑儘量要簡單一些)中。

然後建立一個py檔案,利用Python程式碼開啟這個檔案。

複製程式碼
f = open('d:\護士少婦蘿莉.txt',mode='r',encoding='utf-8')
content = f.read()
print(content)
f.close()

結果:
標題很好
複製程式碼
上面的引數解釋
有了檔案的概念,我們無需再去考慮操作硬碟的細節,只需要關注操作檔案的流程:

複製程式碼

1. 開啟檔案,得到檔案控制代碼並賦值給一個變數

f=open('a.txt','r',encoding='utf-8') #預設開啟模式就為r

2. 通過控制代碼對檔案進行操作

data=f.read()

3. 關閉檔案

f.close()
複製程式碼
練習上面程式碼,可能出現的問題:
  1. 路徑問題。

這個是沒有找到該檔案,很可能是你的檔案路徑錯了。

你的的路徑裡面的\與後面的字元產生了某種'化學反應',這個截圖中的\D此時\就不是路徑分隔符了,\D就有了特殊意義,其實跟\t,\n,換行符一樣,所以針對這種情況,你應該這樣解決:

解決方式一: 'C:\\Users\金鑫\Desktop\\111.txt' 凡是路徑會發生化學反應的地方,多加一個\ 這樣就是前面\對後面的\進行轉譯,告訴計算機這個只是想單純的表示\路徑而已。

解決方式二: r'C:\\Users\金鑫\Desktop\\111.txt' 在路徑的整體前面加一個r。(推薦)

相對路徑與絕對路徑:

  1.絕對路徑:從磁碟根目錄開始一直到檔名

  2.相對路徑:用一個資料夾下的檔案,相對於當前這個程式所在的檔案而言.如果在同一個檔案中,則相對路勁就是這個檔名.如果再上一層資料夾則要使用../相對路徑下,你就可以直接寫檔名即可。

  2. 編碼的問題

  這個問題就是你開啟檔案的編碼與檔案儲存時的編碼用的編碼本不一致導致的。比如這個檔案當時用word軟體儲存時,word軟體預設的編碼為utf-8,但是你利用python程式碼開啟時,用的gbk,那麼這個就會報錯了。

檔案操作的操作模式分為三個類:讀,寫,追加。每一類又有一些具體的方法,那麼接下來我們就分類研究這些方法。

二. 檔案操作:讀
 2.1 r模式
以只讀方式開啟檔案,檔案的指標將會放在檔案的開頭。是檔案操作最常用的模式,也是預設模式,如果一個檔案不設定mode,那麼預設使用r模式操作檔案。

舉例說明:

複製程式碼
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)

結果:
高圓圓
劉亦菲
張柏芝
楊紫
王菲
複製程式碼
  通過上面的例子可以看出來,我將小娃娃這個檔案的內容全部讀取出來了,那麼讀一個檔案還可以怎麼讀取呢?下面我們研究一下不同的讀檔案的方法。

  2.1.1 read()
read()將檔案中的內容全部讀取出來;弊端 如果檔案很大就會非常的佔用記憶體,容易導致記憶體奔潰.

複製程式碼
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)

結果:
高圓圓
劉亦菲
張柏芝
楊紫
王菲
複製程式碼
  2.1.2 read(n)

read()讀取的時候指定讀取到什麼位置

在r模式下,n按照字元讀取。

複製程式碼
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)

結果:
高圓圓

劉亦菲
張柏芝
楊紫
王菲
複製程式碼
  2.1.3 readline()

readline()讀取每次只讀取一行,注意點:readline()讀取出來的資料在後面都有一個\n

複製程式碼
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
msg4 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)

結果:
高圓圓

劉亦菲

張柏芝

楊紫
複製程式碼
解決這個問題只需要在我們讀取出來的檔案後邊加一個strip()就OK了

複製程式碼
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
msg4 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)

結果:
高圓圓
劉亦菲
張柏芝
楊紫
複製程式碼
  2.1.4 readlines()

readlines() 返回一個列表,列表裡面每個元素是原檔案的每一行,如果檔案很大,佔記憶體,容易崩盤。

f = open('log',encoding='utf-8')
print(f.readlines())
f.close()

結果['666666\n', 'fkja l;\n', 'fdkslfaj\n', 'dfsflj\n', 'df;asdlf\n', '\n', ]

上面這四種都太好,因為如果檔案較大,他們很容易撐爆記憶體,所以接下來我們看一下第五種:

    2.1.5 for迴圈

可以通過for迴圈去讀取,檔案控制代碼是一個迭代器,他的特點就是每次迴圈只在記憶體中佔一行的資料,非常節省記憶體。

複製程式碼
f = open('../path1/弟子規',mode='r',encoding='utf-8')
for line in f:
print(line) #這種方式就是在一行一行的進行讀取,它就執行了下邊的功能

print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
複製程式碼
注意點:讀完的檔案控制代碼一定要關閉

2.2 rb模式
  rb模式:以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。記住下面講的也是一樣,帶b的都是以二進位制的格式操作檔案,他們主要是操作非文字檔案:圖片,音訊,視訊等,並且如果你要是帶有b的模式操作檔案,那麼不用宣告編碼方式。

可以網上下載一個圖片給同學們舉例:

當然rb模式也有read read(n) readline(),readlines() for迴圈這幾種方法,我在這就不一一演示了。

三. 檔案操作:寫
第二類就是寫,就是在檔案中寫入內容。這裡也有四種檔案分類主要四種模式:w,wb,w+,w+b,我們只講w,wb。

3.1 w模式

  如果檔案不存在,利用w模式操作檔案,那麼它會先建立檔案,然後寫入內容.

  如果檔案存在,利用w模式操作檔案,先清空原檔案內容,在寫入新內容。

  3.2 wb模式

  wb模式:以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。一般用於非文字檔案如:圖片,音訊,視訊等。

舉例說明:

我先以rb的模式將一個圖片的內容以bytes型別全部讀取出來,然後在以wb將全部讀取出來的資料寫入一個新檔案,這樣我就完成了類似於一個圖片複製的流程。具體程式碼如下:

四. 檔案操作:追加
第三類就是追加,就是在檔案中追加內容。這裡也有四種檔案分類主要四種模式:a,ab,a+,a+b,我們只講a。

4.1 a模式

開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。

  如果檔案不存在,利用a模式操作檔案,那麼它會先建立檔案,然後寫入內容。

  如果檔案存在,利用a模式操作檔案,那麼它會在檔案的最後面追加內容。

五. 檔案操作的其他模式
大家發現了沒有,咱們還有一種模式沒有講,就是那種帶+號的模式。什麼是帶+的模式呢?+就是加一個功能。比如剛才講的r模式是隻讀模式,在這種模式下,檔案控制代碼只能進行類似於read的這讀的操作,而不能進行write這種寫的操作。所以我們想讓這個檔案控制代碼既可以進行讀的操作,又可以進行寫的操作,那麼這個如何做呢?這就是接下來要說這樣的模式:r+ 讀寫模式,w+寫讀模式,a+寫讀模式,r+b 以bytes型別的讀寫模式.........

在這裡咱們只講一種就是r+,其他的大同小異,自己可以練練就行了。

View Code
5.1 r+模式
r+: 開啟一個檔案用於讀寫。檔案指標預設將會放在檔案的開頭。

  注意:如果你在讀寫模式下,先寫後讀,那麼檔案就會出問題,因為預設游標是在檔案的最開始,你要是先寫,則寫入的內容會講原內容覆蓋掉,直到覆蓋到你寫完的內容,然後在後面開始讀取。

六. 檔案操作的其他功能
  6.1 read(n)

    1. 檔案開啟方式為文字模式時,代表讀取n個字元

    2. 檔案開啟方式為b模式時,代表讀取n個位元組

  6.2 seek()

seek(n)游標移動到n位置,注意: 移動單位是byte,所有如果是utf-8的中文部分要是3的倍數

通常我們使用seek都是移動到開頭或者結尾

移動到開頭:seek(0)

移動到結尾:seek(0,2) seek的第二個引數表示的是從哪個位置進行偏移,預設是0,表示開頭,1表示當前位置,2表示結尾

複製程式碼
f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 游標移動到開頭
content = f.read() # 讀取內容, 此時游標移動到結尾
print(content)
f.seek(0) # 再次將游標移動到開頭
f.seek(0, 2) # 將游標移動到結尾
content2 = f.read() # 讀取內容. 什麼都沒有
print(content2)
f.seek(0) # 移動到開頭
f.write("張國榮") # 寫入資訊. 此時游標在9 中文3 * 3個 = 9
f.flush()
f.close() 
複製程式碼
  6.3 tell()

使用tell()可以幫我們獲取當前游標在什麼位置

複製程式碼
f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 游標移動到開頭
content = f.read() # 讀取內容, 此時游標移動到結尾
print(content)
f.seek(0) # 再次將游標移動到開頭
f.seek(0, 2) # 將游標移動到結尾
content2 = f.read() # 讀取內容. 什麼都沒有
print(content2)
f.seek(0) # 移動到開頭
f.write("張國榮") # 寫入資訊. 此時游標在9 中⽂文3 * 3個 = 9
print(f.tell()) # 游標位置9
f.flush()
f.close()
複製程式碼
  6.4 readable(),writeable()

f = open('Test',encoding='utf-8',mode='r')
print(f.readable()) # True
print(f.writable()) # False
content = f.read()
f.close()
3.x所有方法
七. 開啟檔案的另一種方式
咱們開啟檔案都是通過open去開啟一個檔案,其實Python也給咱們提供了另一種方式:with open() as .... 的形式,那麼這種形式有什麼好處呢?

複製程式碼

1,利用with上下文管理這種方式,它會自動關閉檔案控制代碼。

with open('t1',encoding='utf-8') as f1:
f1.read()

2,一個with 語句可以操作多個檔案,產生多個檔案控制代碼。

with open('t1',encoding='utf-8') as f1,
open('Test', encoding='utf-8', mode = 'w') as f2:
f1.read()
f2.write('老男孩老男孩')
複製程式碼
  這裡要注意一個問題,雖然使用with語句方式開啟檔案,不用你手動關閉檔案控制代碼,比較省事兒,但是依靠其自動關閉檔案控制代碼,是有一段時間的,這個時間不固定,所以這裡就會產生問題,如果你在with語句中通過r模式開啟t1檔案,那麼你在下面又以a模式開啟t1檔案,此時有可能你第二次開啟t1檔案時,第一次的檔案控制代碼還沒有關閉掉,可能就會出現錯誤,他的解決方式只能在你第二次開啟此檔案前,手動關閉上一個檔案控制代碼。

八. 檔案的修改
檔案的資料是存放於硬碟上的,因而只存在覆蓋、不存在修改這麼一說,我們平時看到的修改檔案,都是模擬出來的效果,具體的說有兩種實現方式:

方式一:將硬碟存放的該檔案的內容全部載入到記憶體,在記憶體中是可以修改的,修改完畢後,再由記憶體覆蓋到硬碟(word,vim,nodpad++等編輯器)

複製程式碼
import os # 呼叫系統模組

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部讀入記憶體,如果檔案很大,會很卡
data=data.replace('alex','SB') #在記憶體中完成修改

write_f.write(data) #一次性寫入新檔案

os.remove('a.txt') #刪除原檔案
os.rename('.a.txt.swap','a.txt') #將新建的檔案重新命名為原檔案
複製程式碼
方式二:將硬碟存放的該檔案的內容一行一行地讀入記憶體,修改完畢就寫入新檔案,最後用新檔案覆蓋原始檔

複製程式碼
import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f:
line=line.replace('alex','SB')
write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
複製程式碼

複製程式碼

  1. 檔案a.txt內容:每一行內容分別為商品名字,價錢,個數。

apple 10 3

tesla 100000 1

mac 3000 2

lenovo 30000 3

chicken 10 3

通過程式碼,將其構建成這種資料型別:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 並計算出總價錢。

2,有如下檔案:


alex是老男孩python發起人,建立人。

alex其實是人妖。

誰說alex是sb?

你們真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。


將檔案中所有的alex都替換成大寫的SB。