Python文件操作
前言:在使用Python對文件進行操作時,需要先了解絕對路徑和相對路徑。
絕對路徑:指的是從磁盤根目錄到文件名,或者網上的一個完整的網絡地址。例:“D:\Program Files\Tencent\QQ\Bin\QQScLauncher.exe”,https://www.baidu.com/
相對路徑:指的是以當前正在處理的文件為基本路徑進行操作。…/表示當前文件的上一層文件夾,…/…/表示當前文件的上上層文件夾。例:當前文件路徑為:D:\Program Files\Tencent\123.txt,要獲取D:\Program Files\456.txt,可以用"…/456.txt"路徑表示。
tips:建議使用相對路徑,因為在把我們的項目打包發(fā)送給別人時,別人直接就能運行。而如果使用絕對路徑,那么還要額外發(fā)送外部的文件。
一、文件操作介紹
使?Python來讀寫?件是非常簡單的操作. 我們使?open()函數(shù)來打開?個?件, 獲取到?
件句柄. 然后通過?件句柄就可以進?各種各樣的操作了. 根據(jù)打開?式的不同能夠執(zhí)?的操
作也會有相應的差異.
打開?件的?式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默認使?的是r(只讀)模式
二、讀操作(r,rb)
f = open(file_path, mode = "r", enoding="utf-8")
content = f.read()
f.close()
print(content)
#file_path:文件路徑,可使用絕對路徑也可使用相對路徑
#mode:指定對文件進行的操作
#encoding:解碼(讀)或者編碼(寫)的格式,一般大多數(shù)都是采用utf-8格式
#close():釋放文件句柄
#還可以這樣寫
with open(file_path, mode="r", encoding="utf-8") as f:
content = f.read()
print(content)
這樣寫會在執(zhí)行完成之后自動釋放文件句柄,不需要自己手動釋放
f = open(file_path, mode = "rb")
content = f.read()
f.close()
print(content)
#因為rb讀取出來之后的數(shù)據(jù)是bytes類型,即就是字節(jié),所以我們在使用rb時可以不用指定encoding。
rb的作?: 在讀取非?本?件的時候,比如讀取MP3、圖像、 視頻等信息的時候就需要?到rb。 因為這種數(shù)據(jù)是沒辦法直接顯?出來的,還有,我們看的直播, 實際上都是這種數(shù)據(jù)。
讀取文件的方法
read():將文件里的內容全部讀取出來。弊端:如果文件內容數(shù)據(jù)過大,讀取時將會非常占用內存且非常緩慢,嚴重會導致內存崩潰。
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個字符。需要注意的是,如果你已經進行了讀取操作,那么下一次讀取將會從光標定位處繼續(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ù)末尾都會有\(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ù)形成一個元素放在一個列表中。弊端:和read()一樣,都是全部將數(shù)據(jù)讀取出來,容易導致內存崩潰。
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)點:循環(huán)一次讀取一行,不會產生內存突然溢出崩潰這種情況。(建議使用)
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)
寫的時候注意。 如果沒有?件,則會創(chuàng)建?件。 如果?件存在, 則將原件中原來的內容刪除, 再寫入新內容。
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模式寫入時,不需要指定文件的編碼格式,但是在將內容寫入時,要將內容轉換成對應格式的bytes類型
f.flush()
f.close()
四、追加操作(a,ab)
在追加模式下,我們寫入的內容會追加在?件的結尾。
f = open("file/dog", mode = "a", encoding="utf-8")
f.write("你是最靚的仔")
f.flush()
f.close()
五、讀寫操作(r+,r+b)
在讀寫操作模式下,必須先進行讀操作,再進行寫操作,因為光標默認是在開頭的,讀取會默認從頭開始讀到尾,在開始寫。
正常讀寫
f = open("file/dog", mode = "r+", encoding="utf-8")
content = f.read()
f.write("哈哈哈")
f.flush()
f.close()
錯誤讀寫
f = open("file/dog", mode = "r+", encoding="utf-8")
f.write("哈哈哈")
content = f.read()
f.flush()
f.close()
開頭前三個字將會被“哈哈哈”替換,然后讀取的內容也是從第三個字之后開始讀取。
核能警告:在r+模式下,如果你讀取了內容,不管你讀取了多少內容,光標定位在何處,后面的寫操作都將追加在文件內容末尾。如果你沒有先進行讀取操作而是先進行了寫操作,那么寫操作會將寫入的內容替換掉開頭對應長度的內容。
六、寫讀操作(w+,w+b)
在寫讀模式下,先將內容清空,然后寫入內容。在進行讀操作時,因為在進行寫操作時光標已定位在末尾,所以讀取不到任何內容。所以寫讀模式不常使用。
f = open("file/dog", mode = "w+", encoding="utf-8")
f.write("哈哈哈")
content = f.read()
f.flush()
f.close()
print(content) # ""
#為什么不能先進行讀操作在進行寫操作?
#因為在w+模式下,先進行讀操作是讀不出來任何數(shù)據(jù)的,然后在進行寫數(shù)據(jù),又是將內容清空寫入。所以無論是先讀后寫還是先寫后讀都是一樣的結果。
七、追加讀寫操作(a+,a+b)
在a+操作時,無論是先進行讀操作還是后進行讀操作都無法讀取到數(shù)據(jù),因為光標始終定位在文件內容末尾處。
f = open("file/dog", mode = "a+", encoding="utf-8")
f.write("寫了也讀不出來")
content = f.read()
f.flush()
f.close()
print(content)
八、其它相關操作
seek(n, type):光標移動到n個字節(jié)位置,因為我們大部分是采用utf-8的編碼格式,所以一般n取得都是3的倍數(shù)。
seek()第一個參數(shù)指移動的字節(jié)數(shù)。
seek()第二個參數(shù)指的是從哪個位置進行偏移。取值可以是0,1,2。默認是0。
0:指相對開頭偏移
1:指相對本身位置進行偏移
2:指相對結尾偏移
開頭:seek(0)
結尾:seek(0, 2)
tell():幫助我們獲取當前光標位置,返回的值也是以字節(jié)為單位進行度量的。
truncate():截斷文件
f = open("?娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 寫?兩個字符
f.seek(3) # 光標移動到3, 也就是兩個字中間
f.truncate() # 刪掉光標后?的所有內容
f.close()
做截斷操作之前,要先挪動光標,挪動到你想要截斷的位置, 然后再進?截斷。關于truncate(n), 如果給出了n, 則從開頭開頭進?截斷, 如果不給n, 則從當前位置截斷, 后?的內容將會被刪除。
九、修改文件
?件修改: 只能將?件中的內容先讀取出來, 將信息修改完畢, 然后將源?件刪除,將新?件的名字改成老?件的名字。
#文件修改
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 爬百度貼吧圖片
# 安裝的方法很簡單, cmd 執(zhí)行pip install beautifulsoup4
from bs4 import BeautifulSoup
import requests
# 爬取目標網頁
html = requests.get("https://tieba.baidu.com/p/6021111523")
html = html.text
# 解析網頁
result = BeautifulSoup(html, 'html.parser')
#獲取所有的圖片img
result_imgs = result.find_all("img",class_= "BDE_Image")
print(result_imgs)
i = 1 #計數(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
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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