Python文件操作
前言:在使用Python對(duì)文件進(jìn)行操作時(shí),需要先了解絕對(duì)路徑和相對(duì)路徑。
絕對(duì)路徑:指的是從磁盤根目錄到文件名,或者網(wǎng)上的一個(gè)完整的網(wǎng)絡(luò)地址。例:“D:\Program Files\Tencent\QQ\Bin\QQScLauncher.exe”,https://www.baidu.com/
相對(duì)路徑:指的是以當(dāng)前正在處理的文件為基本路徑進(jìn)行操作。…/表示當(dāng)前文件的上一層文件夾,…/…/表示當(dāng)前文件的上上層文件夾。例:當(dāng)前文件路徑為:D:\Program Files\Tencent\123.txt,要獲取D:\Program Files\456.txt,可以用"…/456.txt"路徑表示。
tips:建議使用相對(duì)路徑,因?yàn)樵诎盐覀兊捻?xiàng)目打包發(fā)送給別人時(shí),別人直接就能運(yùn)行。而如果使用絕對(duì)路徑,那么還要額外發(fā)送外部的文件。
一、文件操作介紹
使?Python來讀寫?件是非常簡(jiǎn)單的操作. 我們使?open()函數(shù)來打開?個(gè)?件, 獲取到?
件句柄. 然后通過?件句柄就可以進(jìn)?各種各樣的操作了. 根據(jù)打開?式的不同能夠執(zhí)?的操
作也會(huì)有相應(yīng)的差異.
打開?件的?式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默認(rèn)使?的是r(只讀)模式
二、讀操作(r,rb)
f = open(file_path, mode = "r", enoding="utf-8")
content = f.read()
f.close()
print(content)
#file_path:文件路徑,可使用絕對(duì)路徑也可使用相對(duì)路徑
#mode:指定對(duì)文件進(jìn)行的操作
#encoding:解碼(讀)或者編碼(寫)的格式,一般大多數(shù)都是采用utf-8格式
#close():釋放文件句柄
#還可以這樣寫
with open(file_path, mode="r", encoding="utf-8") as f:
content = f.read()
print(content)
這樣寫會(huì)在執(zhí)行完成之后自動(dòng)釋放文件句柄,不需要自己手動(dòng)釋放
f = open(file_path, mode = "rb")
content = f.read()
f.close()
print(content)
#因?yàn)閞b讀取出來之后的數(shù)據(jù)是bytes類型,即就是字節(jié),所以我們?cè)谑褂胷b時(shí)可以不用指定encoding。
rb的作?: 在讀取非?本?件的時(shí)候,比如讀取MP3、圖像、 視頻等信息的時(shí)候就需要?到rb。 因?yàn)檫@種數(shù)據(jù)是沒辦法直接顯?出來的,還有,我們看的直播, 實(shí)際上都是這種數(shù)據(jù)。
讀取文件的方法
read():將文件里的內(nèi)容全部讀取出來。弊端:如果文件內(nèi)容數(shù)據(jù)過大,讀取時(shí)將會(huì)非常占用內(nèi)存且非常緩慢,嚴(yán)重會(huì)導(dǎo)致內(nèi)存崩潰。
f = open("file/userinfo", mode="r", encoding="utf-8")
content = f.read()
f.close()
print(content)
# dogfa_111111
oldwang_123456
dajiba_dajiba
caoduanjie_111111
oldniu_1332611346
read(n):一次讀取n個(gè)字符。需要注意的是,如果你已經(jīng)進(jìn)行了讀取操作,那么下一次讀取將會(huì)從光標(biāo)定位處繼續(xù)讀取,即上次讀取完的位置。rb讀取出來的是字節(jié)。
f = open("file/userinfo", mode="r", encoding="utf-8")
content = f.read(5)
content2 = f.read(5)
f.close()
print(content)
print(content2)
#dogfa
#_1111
readline():一次讀取一行數(shù)據(jù)。需要注意的是,每次讀取出來的數(shù)據(jù)末尾都會(huì)有\(zhòng)n,所以我們可以使用strip()來清除\n
f = open("file/userinfo", mode="r", encoding="utf-8")
content = f.readline()
content2 = f.readline()
f.close()
print(content)
print(content2)
#dogfa_111111
#oldwang_123456
readlines():讀取所有數(shù)據(jù),將每一行數(shù)據(jù)形成一個(gè)元素放在一個(gè)列表中。弊端:和read()一樣,都是全部將數(shù)據(jù)讀取出來,容易導(dǎo)致內(nèi)存崩潰。
f = open("file/userinfo", mode="r", encoding="utf-8")
content = f.readlines()
print(content)
for line in content:
print(line)
f.close()
#['dogfa_111111\n', 'oldwang_123456\n', 'dajiba_dajiba\n', 'caoduanjie_111111\n', 'oldniu_1332611346\n']
#dogfa_111111
#oldwang_123456
#dajiba_dajiba
#caoduanjie_111111
#oldniu_1332611346
循環(huán)讀取:for line in f: pass。優(yōu)點(diǎn):循環(huán)一次讀取一行,不會(huì)產(chǎn)生內(nèi)存突然溢出崩潰這種情況。(建議使用)
f = open("file/userinfo", mode="r", encoding="utf-8")
for line in f:
print(line)
f.close()
#dogfa_111111
#oldwang_123456
#dajiba_dajiba
#caoduanjie_111111
#oldniu_1332611346
三、寫操作(w,wb)
寫的時(shí)候注意。 如果沒有?件,則會(huì)創(chuàng)建?件。 如果?件存在, 則將原件中原來的內(nèi)容刪除, 再寫入新內(nèi)容。
f = open("file/dog", mode = "w", encoding="utf-8")
f.write("看我這條blog的你真帥!")
f.flush()
f.close()
f = open("file/dog", mode = "wb")
f.write("看我這條blog的你真帥!".encode("utf-8"))
#使用wb模式寫入時(shí),不需要指定文件的編碼格式,但是在將內(nèi)容寫入時(shí),要將內(nèi)容轉(zhuǎn)換成對(duì)應(yīng)格式的bytes類型
f.flush()
f.close()
四、追加操作(a,ab)
在追加模式下,我們寫入的內(nèi)容會(huì)追加在?件的結(jié)尾。
f = open("file/dog", mode = "a", encoding="utf-8")
f.write("你是最靚的仔")
f.flush()
f.close()
五、讀寫操作(r+,r+b)
在讀寫操作模式下,必須先進(jìn)行讀操作,再進(jìn)行寫操作,因?yàn)楣鈽?biāo)默認(rèn)是在開頭的,讀取會(huì)默認(rèn)從頭開始讀到尾,在開始寫。
正常讀寫
f = open("file/dog", mode = "r+", encoding="utf-8")
content = f.read()
f.write("哈哈哈")
f.flush()
f.close()
錯(cuò)誤讀寫
f = open("file/dog", mode = "r+", encoding="utf-8")
f.write("哈哈哈")
content = f.read()
f.flush()
f.close()
開頭前三個(gè)字將會(huì)被“哈哈哈”替換,然后讀取的內(nèi)容也是從第三個(gè)字之后開始讀取。
核能警告:在r+模式下,如果你讀取了內(nèi)容,不管你讀取了多少內(nèi)容,光標(biāo)定位在何處,后面的寫操作都將追加在文件內(nèi)容末尾。如果你沒有先進(jìn)行讀取操作而是先進(jìn)行了寫操作,那么寫操作會(huì)將寫入的內(nèi)容替換掉開頭對(duì)應(yīng)長(zhǎng)度的內(nèi)容。
六、寫讀操作(w+,w+b)
在寫讀模式下,先將內(nèi)容清空,然后寫入內(nèi)容。在進(jìn)行讀操作時(shí),因?yàn)樵谶M(jìn)行寫操作時(shí)光標(biāo)已定位在末尾,所以讀取不到任何內(nèi)容。所以寫讀模式不常使用。
f = open("file/dog", mode = "w+", encoding="utf-8")
f.write("哈哈哈")
content = f.read()
f.flush()
f.close()
print(content) # ""
#為什么不能先進(jìn)行讀操作在進(jìn)行寫操作?
#因?yàn)樵趙+模式下,先進(jìn)行讀操作是讀不出來任何數(shù)據(jù)的,然后在進(jìn)行寫數(shù)據(jù),又是將內(nèi)容清空寫入。所以無論是先讀后寫還是先寫后讀都是一樣的結(jié)果。
七、追加讀寫操作(a+,a+b)
在a+操作時(shí),無論是先進(jìn)行讀操作還是后進(jìn)行讀操作都無法讀取到數(shù)據(jù),因?yàn)楣鈽?biāo)始終定位在文件內(nèi)容末尾處。
f = open("file/dog", mode = "a+", encoding="utf-8")
f.write("寫了也讀不出來")
content = f.read()
f.flush()
f.close()
print(content)
八、其它相關(guān)操作
seek(n, type):光標(biāo)移動(dòng)到n個(gè)字節(jié)位置,因?yàn)槲覀兇蟛糠质遣捎胾tf-8的編碼格式,所以一般n取得都是3的倍數(shù)。
seek()第一個(gè)參數(shù)指移動(dòng)的字節(jié)數(shù)。
seek()第二個(gè)參數(shù)指的是從哪個(gè)位置進(jìn)行偏移。取值可以是0,1,2。默認(rèn)是0。
0:指相對(duì)開頭偏移
1:指相對(duì)本身位置進(jìn)行偏移
2:指相對(duì)結(jié)尾偏移
開頭:seek(0)
結(jié)尾:seek(0, 2)
tell():幫助我們獲取當(dāng)前光標(biāo)位置,返回的值也是以字節(jié)為單位進(jìn)行度量的。
truncate():截?cái)辔募?
f = open("?娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 寫?兩個(gè)字符
f.seek(3) # 光標(biāo)移動(dòng)到3, 也就是兩個(gè)字中間
f.truncate() # 刪掉光標(biāo)后?的所有內(nèi)容
f.close()
做截?cái)嗖僮髦埃扰矂?dòng)光標(biāo),挪動(dòng)到你想要截?cái)嗟奈恢茫?然后再進(jìn)?截?cái)唷jP(guān)于truncate(n), 如果給出了n, 則從開頭開頭進(jìn)?截?cái)啵?如果不給n, 則從當(dāng)前位置截?cái)啵?后?的內(nèi)容將會(huì)被刪除。
九、修改文件
?件修改: 只能將?件中的內(nèi)容先讀取出來, 將信息修改完畢, 然后將源?件刪除,將新?件的名字改成老?件的名字。
#文件修改
import os
with open("file/dog", mode="r", encoding="utf-8") as f1, open("file/dog_new", mode="w", encoding="utf-8") as f2:
for line in f1:
line_new = line.replace("哈", "嘻")
f2.write(line_new)
os.remove("file/dog")
os.rename("file/dog_new", "file/dog")
案例 bs4 爬百度貼吧圖片
# 安裝的方法很簡(jiǎn)單, cmd 執(zhí)行pip install beautifulsoup4
from bs4 import BeautifulSoup
import requests
# 爬取目標(biāo)網(wǎng)頁(yè)
html = requests.get("https://tieba.baidu.com/p/6021111523")
html = html.text
# 解析網(wǎng)頁(yè)
result = BeautifulSoup(html, 'html.parser')
#獲取所有的圖片img
result_imgs = result.find_all("img",class_= "BDE_Image")
print(result_imgs)
i = 1 #計(jì)數(shù)器
for result_img in result_imgs:
# 獲取鏈接
img_url=result_img['src'] # pyhon中的字典
# 獲取文件
result_img_content = requests.get(img_url).content
file_name = str(i)+'.jpg'
# 保存圖片
with open(file_name,'wb') as wf:
wf.write(result_img_content)
#i+= 1 # i=i+1與i+=1意思相同
i=i+1
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
