日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

开头th_是什么文件_Python文件读写最详细的讲解

發(fā)布時(shí)間:2023/12/4 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开头th_是什么文件_Python文件读写最详细的讲解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文來自公眾號:可樂的數(shù)據(jù)分析之路

今天這篇文章來詳細(xì)講解一下Python中的文件讀寫。

1、文件讀寫的流程

1)類比windows中手動操作txt文檔,說明python中如何操作txt文件?

① windows中手動操作txt文件的步驟

  • 找到word文檔

  • 打開word文檔

  • 查看(或操作)word文檔中的內(nèi)容

  • 關(guān)閉word文檔

② python操作txt文件的步驟

  • 獲取被打開的文件的內(nèi)存對象,該內(nèi)存對象又叫做“文件句柄”。

  • 通過這個(gè)內(nèi)存對象(文件句柄),來對文件進(jìn)行操作(讀取,寫入等操作)。

  • 關(guān)閉文件

2)什么是文件的內(nèi)存對象(文件句柄)?

使用python讀取一個(gè)txt文件的時(shí)候,相當(dāng)于把這個(gè)文件從硬盤上,讀取到了內(nèi)存中。我們?nèi)绻胍僮鬟@個(gè)文件,是不是先要獲取這個(gè)文件對象?只有獲取這個(gè)文件對象后,才能夠真正的去操作這個(gè)文件,不管是讀取文件中的內(nèi)容,還是向文件中寫入內(nèi)容。

這個(gè)“文件句柄”包含了文件的文件名、文件的字符集、文件的大小、文件在硬盤上的起始位置。

3)演示怎么讀取文件

① 演示如下

f?=?open(r"G:\6Tipdm\file_read_write\yesterday.txt","r",encoding="utf-8")
data??=?f.read()
print(data[:245])
f.close()

結(jié)果如下:

② 一個(gè)很奇怪的現(xiàn)象?

f?=?open(r"G:\6Tipdm\file_read_write\yesterday.txt","r",encoding="utf-8")
data??=?f.read()
data1?=?f.read()
print(data[:245])
print("-------------------------------------")
print(data1[:245])
f.close()

結(jié)果如下:

問題:我們讀取了2遍內(nèi)容,為什么只顯示了一次讀取的結(jié)果呢?對于上述問題,我們用一張圖回答上述問題。
通過上圖我們可以發(fā)現(xiàn),當(dāng)我們操作這個(gè)“文件句柄”的read()方法去讀取文件的時(shí)候,這個(gè)句柄會從文件的開頭位置1,移動到文件的結(jié)束位置2。如果不做任何操作,讀取完畢之后,句柄就會停止在2這個(gè)位置。因此當(dāng)我們再次讀取文件的時(shí)候,該句柄是從2這個(gè)位置,往后面讀取內(nèi)容。由于后面沒有任何內(nèi)容,因此第二次讀取為空。

那么,如果我們想要第二次同樣能夠讀取到文件中的內(nèi)容,應(yīng)該怎么辦呢?那么接著往下看。

4)演示怎么寫文件

f?=?open(r"G:\6Tipdm\file_read_write\yesterday2.txt","w",encoding="utf-8")
f.write("我愛北京天安門")
f.close()

結(jié)果如下:


假如我們在寫一句“天安門上太陽升”,會出現(xiàn)啥情況呢?f?=?open(r"G:\6Tipdm\file_read_write\yesterday2.txt","w",encoding="utf-8")
f.write("天安門上太陽升")
f.write("很好,很好")
f.close()

結(jié)果如下:


意外發(fā)生。當(dāng)我們再次寫入新的內(nèi)容的時(shí)候,發(fā)現(xiàn)之前寫的內(nèi)容不見了,這是為啥呢?這就是我們下面要講述的“文件讀寫的幾種常見模式”。

2、文件讀寫的幾種常見模式(你不清楚的知識點(diǎn))

1)關(guān)于r+、w+、a+使用說明(易錯(cuò)點(diǎn))

當(dāng)我們讀取某個(gè)文件,向文件中寫入某些內(nèi)容(覆蓋寫),向文件中追加寫入某寫內(nèi)容時(shí),最好的方式就是分別使用r、w、a這三種模式。對于這三種模式,要么讀,要么寫,讀模式就不能寫,寫模式就不能讀。

對于r+、w+、a+這三種模式,如果你不是特別清楚python文件讀寫的原理,就不要輕易使用,因?yàn)闀霈F(xiàn)很多問題,下面我們僅演示r+、w+、a+這三種模式。

2)r+模式:可讀可寫

對于這種模式,不管是讀取文件中的內(nèi)容,還是朝文件中寫入內(nèi)容。前提條件:文件存在。

#?只讀取文件中的內(nèi)容
f?=?open(r"G:\6Tipdm\file_read_write\yesterday1.txt","r+",encoding="utf-8")
data?=?f.read()
print(data)
f.close()

#?朝文件中寫入內(nèi)容后,立即讀取,會出現(xiàn)啥問題?
f?=?open(r"G:\6Tipdm\file_read_write\yesterday1.txt","r+",encoding="utf-8")
f.write("麗麗姑娘")

data?=?f.read()
print(data)
f.close()

#?朝文件中寫入內(nèi)容后,調(diào)整句柄位置后,再讀取,會出現(xiàn)啥問題?
f?=?open(r"G:\6Tipdm\file_read_write\yesterday1.txt","r+",encoding="utf-8")
f.write("麗麗姑娘")
f.seek(0)
data?=?f.read()
print(data)
f.close()

結(jié)果如下:

結(jié)果分析:
使用r+模式,當(dāng)只讀文件的時(shí)候,可以讀取到其中的內(nèi)容。

當(dāng)寫入內(nèi)容后,立即讀取文件內(nèi)容,發(fā)現(xiàn)什么也讀取不到。這是由于當(dāng)你寫入內(nèi)容后,文件句柄會放在寫入內(nèi)容的最后面,因此當(dāng)你立即讀取的時(shí)候,句柄會從上次內(nèi)容最后的位置,朝后面讀,因此讀取為空。

當(dāng)朝文件中寫入內(nèi)容后,調(diào)整句柄位置后,再讀取文件中的內(nèi)容,發(fā)現(xiàn)就有了內(nèi)容。這是由于我們使用了f.seek(0)方法,將句柄由內(nèi)容末尾調(diào)整到了內(nèi)容開頭,因此就又有了內(nèi)容。

3)w+:可讀可寫

#?直接往文件中寫入內(nèi)容
f?=?open(r"G:\6Tipdm\file_read_write\yesterday3.txt","w+",encoding="utf-8")
f.write("bbbbbb")
f.close()

#?直接讀取上述文件,看看會發(fā)生啥問題?(特別注意這一步)
f?=?open(r"G:\6Tipdm\file_read_write\yesterday3.txt","w+",encoding="utf-8")
data?=?f.read()
print(data)
f.close()

#?朝文件中寫入內(nèi)容后,立即讀取,又會發(fā)生什么?
f?=?open(r"G:\6Tipdm\file_read_write\yesterday3.txt","w+",encoding="utf-8")
f.write("哈哈哈哈哈")
data?=?f.read()
print(data)
f.close()

#?朝文件中寫入內(nèi)容后,調(diào)整句柄位置后,再讀取,會發(fā)生什么?
f?=?open(r"G:\6Tipdm\file_read_write\yesterday3.txt","w+",encoding="utf-8")
f.write("嘿嘿嘿嘿嘿")
f.seek(0)
data?=?f.read()
print(data)
f.close()

結(jié)果如下:

結(jié)果分析:
使用w+模式,當(dāng)我們直接朝文件中寫入bbbbbb,毋庸置疑,肯定是可以的。

接著,我們直接讀取這個(gè)文件中的內(nèi)容,奇怪的現(xiàn)象發(fā)生了,什么都讀取不到。這是因?yàn)閣+模式,在進(jìn)行文件讀取的時(shí)候,默認(rèn)是先寫再讀。但是我們確實(shí)沒有寫入任何東西呀?這是由于系統(tǒng)默認(rèn)幫我們寫入了一個(gè)空值,因此把原有內(nèi)容覆蓋了。所以再當(dāng)我們讀取文件中的內(nèi)容的時(shí)候,發(fā)現(xiàn)讀取為空。

再接著,我們朝文件中,寫入內(nèi)容后再立即讀取,這下仍然讀取不到任何內(nèi)容,這又是為什么呢?這是由于我們第一次寫入“哈哈哈哈哈哈”的時(shí)候,句柄移動到了內(nèi)容最后。當(dāng)我們立即讀取的時(shí)候,句柄從內(nèi)容最后的位置,繼續(xù)朝后面讀,因此啥也沒有。

最后,當(dāng)朝文件中寫入內(nèi)容后,調(diào)整句柄位置后,再讀取文件中的內(nèi)容,發(fā)現(xiàn)就有了內(nèi)容。這是由于我們使用了f.seek(0)方法,將句柄由內(nèi)容末尾調(diào)整到了內(nèi)容開頭,因此就又有了內(nèi)容。

4)a+:可讀可寫

#?直接朝文件中寫入內(nèi)容
f?=?open(r"G:\6Tipdm\file_read_write\yesterday4.txt","a+",encoding="utf-8")
f.write("哈哈")
f.close()

#?直接讀取文件中的內(nèi)容
f?=?open(r"G:\6Tipdm\file_read_write\yesterday4.txt","a+",encoding="utf-8")
data?=?f.read()
print(data)
f.close()

#?調(diào)整句柄位置后,再讀取文件中的內(nèi)容
f?=?open(r"G:\6Tipdm\file_read_write\yesterday4.txt","a+",encoding="utf-8")
f.seek(0)
data?=?f.read()
print(data)
f.close()

結(jié)果如下:

結(jié)果分析:
使用a+模式,朝文件中寫入內(nèi)容,毋庸置疑,肯定是沒問題的。

接著,當(dāng)我們讀取上述文件中的內(nèi)容,會發(fā)現(xiàn)什么也讀取不到。這是由于,使用r+模式打開文件,文件句柄默認(rèn)放在內(nèi)容的最后面,因此你直接讀取其中的內(nèi)容,什么也沒有。

最后,在讀取文件中內(nèi)容之前,我們使用了f.seek(0)方法,將句柄由內(nèi)容末尾調(diào)整到了內(nèi)容開頭,再次讀取文件中的內(nèi)容,發(fā)現(xiàn)就有了內(nèi)容。

3、read、readline、readlines的區(qū)別

1)read()方法的使用說明

f?=?open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8")
data?=?f.read()
print(type(data))
print(data)
f.close()

結(jié)果如下:

2)readline()方法的使用說明

f?=?open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8")
data?=?f.readline()
print(type(data))
print(data)
f.close()

f?=?open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8")
for?i?in?range(3):
????data?=?f.readline()
????print(data)
f.close()

結(jié)果如下:


去掉每一行末尾的換行符:f?=?open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8")
for?i?in?range(3):
????data?=?f.readline().strip()
????print(data)
f.close()

結(jié)果如下:

3)readlines()方法的使用說明

f?=?open(r"G:\6Tipdm\file_read_write\test.txt","r",encoding="utf-8")
data?=?f.readlines()
print(type(data))
print(data)
f.close()

結(jié)果如下:

4、對于一個(gè)10G的大文件,怎么高效的查看文件中的內(nèi)容呢?

1)相關(guān)說明

當(dāng)我們讀取文件中的內(nèi)容,相當(dāng)于是把寫在硬盤上的東西,讀取到內(nèi)存中。不管你是使用read()或者readlines()一次性讀取到到內(nèi)存中,還是使用readline()一行行的將整個(gè)內(nèi)容讀取到內(nèi)存中,如果文件很大,都將會耗用很大的內(nèi)存。同時(shí),從硬盤讀取文件內(nèi)容到內(nèi)存中,也會很慢。

因此,有沒有一種高效的方式?既讓我們看到了文件中的內(nèi)容,又不會占用內(nèi)存呢?下面我們將進(jìn)行說明。

2)操作說明

f?=?open(r"G:\6Tipdm\file_read_write\yesterday.txt","r",encoding="utf-8")
for?line?in?f:
????print(line.strip())

部分截圖如下:

結(jié)果說明:
上述方式中,f相當(dāng)于一個(gè)迭代器,我們使用for循環(huán)迭代f中元素。每循環(huán)一次,就相當(dāng)于讀取一行到內(nèi)存中,并記住這一次讀取到的位置。當(dāng)進(jìn)行下次迭代的時(shí)候,上一次讀取到內(nèi)存中的內(nèi)容,就會被銷毀了,當(dāng)前內(nèi)存中讀取的就是第二行的內(nèi)容。當(dāng)進(jìn)行第三次循環(huán)的時(shí)候,內(nèi)存中第二行的內(nèi)容也會被銷毀,此時(shí)內(nèi)存中只會保存第三行的內(nèi)容,這樣依次進(jìn)行下去。直到最后一次循環(huán),讀取最后一行的內(nèi)容,此時(shí),內(nèi)存中保留的也只是最后一行的內(nèi)容。

迭代器有一個(gè)特性:每次進(jìn)行迭代的時(shí)候,就會記住當(dāng)前讀取的位置。當(dāng)進(jìn)行下一次迭代的時(shí)候,前面的內(nèi)容會被銷毀掉,在內(nèi)存中只會保留當(dāng)前循環(huán)得到的內(nèi)容。

歡迎掃碼關(guān)注作者的CSDN:

戳一下右下角在看,小小舉動,大大支持~

加入機(jī)器學(xué)習(xí)微信群,請后臺回復(fù)「入群

推薦閱讀:

當(dāng)當(dāng)撒幣了這是一份優(yōu)秀的機(jī)器學(xué)習(xí)書單極度通俗易懂:《漫畫算法》(Python篇)

喜歡文章,點(diǎn)個(gè)在看?

總結(jié)

以上是生活随笔為你收集整理的开头th_是什么文件_Python文件读写最详细的讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。