日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python File文件方法操作open()

系統(tǒng) 2477 0

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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 东乡县| 平利县| 防城港市| 铜陵市| 玛曲县| 江城| 临猗县| 太谷县| 永春县| 简阳市| 开阳县| 贵阳市| 万山特区| 永川市| 会同县| 石台县| 安国市| 红桥区| 通许县| 新巴尔虎右旗| 色达县| 大厂| 新密市| 山西省| 合川市| 伊吾县| 惠安县| 富顺县| 旺苍县| 五河县| 武平县| 驻马店市| 乃东县| 马关县| 云林县| 清河县| 柳林县| 阿合奇县| 蛟河市| 嵩明县| 砚山县|