文件操作概要

⼀. 初識文件操作

使⽤python來讀寫⽂件是非常簡單的操作,我們使⽤open()函數來打開⼀個⽂件, 獲取到⽂
件句柄,然後通過⽂件句柄就可以進⾏各種各樣的操作了,根據打開⽅式的不同能夠執⾏的操
作也會有相應的差異。
打開⽂件的⽅式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默認使⽤的是r(只讀)模式

⼆. 只讀操作(r, rb)

在程序當前目錄下創建一個記事本文件命名爲“我的詞”(小聲逼逼,內容確實是本人當年胡亂寫的,詞牌名爲法曲獻仙音,雙調九十二字,前段八句四平韻,後段九句五仄韻,曾發表在中國詩歌網,咳咳,往事不提,以後老了閒着沒事可以寫寫詩詞文章,現在努力敲代碼,上代碼)

f = open("我的詞.txt",mode="r", encoding="utf-8")
content = f.read()
print(content)
f.close()

運行結果如下:
在這裏插入圖片描述
需要注意encoding表⽰編碼集. 根據⽂件的實際保存編碼進⾏獲取數據, 對於我們⽽⾔使用更
多的是utf-8編碼。
rb. 讀取出來的數據是bytes類型, 在rb模式下. 不能選擇encoding字符集.

f = open("我的詞.txt",mode="rb" )
content = f.read()
print(content)
f.close()

運行結果:

b'\r\n\xe8\x9d\x89\xe9\xbc\x93\xe5\xa4\xa9\xe7\x82\x8e\xef\xbc\x8c\xe6\xb0\xb4\xe7\x94\x9f\xe8\x8e\xb2\xe5\xb9\x95\xef\xbc\x8c\xe5\xa4\x8f\xe6\x97\xa5\xe7\xbe\xa1\xe6\xb9\x96\xe6\xb7\xb1\xe5\xa4\x84\xe3\x80\x82\r\n\xe5\x80\xa6\xe5\x90\xac\xe6\xb8\x85\xe9\x9f\xb3\xef\xbc\x8c\xe5\x9b\xb0\xe5\xaf\xbb\xe4\xbc\x91\xe5\xa4\x84\xef\xbc\x8c\xe8\xa7\x82\xe9\xb1\xbc\xe6\xa2\xa6\xe5\x87\x89\xe6\x80\x9d\xe8\xba\x87\xe3\x80\x82\r\n\xe4\xb8\x8d\xe6\x84\x8f\xe6\x98\xaf\xe5\x87\x9d\xe6\x83\x85\xe5\xa4\x84\xef\xbc\x8c\xe4\xb9\xa1\xe5\xa3\xb0\xe5\xb8\xa6\xe6\x84\x81\xe5\x8e\xbb\xe3\x80\x82\r\n\r\n\xe5\xb1\xa1\xe5\x9b\x9e\xe9\xa1\xbe\xef\xbc\x8c\xe5\x8f\xb9\xe6\x96\x87\xe5\x9b\xad\xe3\x80\x81\xe6\x9c\xaa\xe6\x88\x90\xe5\xbd\x92\xe8\xb7\xaf\xe3\x80\x82\r\n\xe8\xb0\x81\xe5\xbf\xb5\xe6\x88\x91\xe3\x80\x81\xe5\xa4\x9a\xe6\x80\x9d\xe6\x98\x93\xe6\x88\x90\xe9\x97\xb4\xe9\x98\xbb\xef\xbc\x9f\xe5\x94\xa4\xe8\xb5\xb7\xe5\xbc\x82\xe4\xb9\xa1\xe4\xba\xba\xef\xbc\x8c\xe9\x97\xae\xe4\xb8\x8a\xe4\xbb\x99\xe3\x80\x81\xe4\xbb\x8a\xe5\x9c\xa8\xe4\xbd\x95\xe4\xbd\x8f\xef\xbc\x9f\r\n\xe7\xbf\xbb\xe9\x98\x85\xe4\xb9\xa6\xe5\x8d\xb7\xef\xbc\x8c\xe5\x88\xb0\xe5\xa6\x82\xe4\xbb\x8a\xe3\x80\x81\xe4\xb8\x8d\xe9\x81\x93\xe7\xa7\x80\xe5\x8f\xa5\xe3\x80\x82\xe5\xbe\x85\xe8\x8a\xb1\xe6\x98\x8e\xe6\x9f\xb3\xe6\x9a\x97\xef\xbc\x8c\xe8\xa7\x81\xe4\xba\x86\xe4\xb8\x8d\xe6\x95\x99\xe5\xbd\x92\xe5\x8e\xbb\xe3\x80\x82\r\n'

rb的作⽤: 在讀取非⽂本⽂件的時候,比如讀取MP3、 圖像、視頻等信息的時候就需要⽤到
rb,因爲這種數據是沒辦法直接顯⽰出來的,在後⾯我們⽂件上傳下載的時候還會⽤到, 還有我們看的直播實際上都是這種數據。

絕對路徑和相對路徑:

這裏稍微提一下:

  1. 絕對路徑:從磁盤根⽬錄開始⼀直到⽂件名.
  2. 相對路徑:同⼀個⽂件夾下的⽂件. 相對於當前這個程序所在的⽂件夾⽽⾔. 如果在同
    ⼀個⽂件夾中. 則相對路徑就是這個⽂件名. 如果在上⼀層⽂件夾. 則要…/
    這裏我們更推薦⼤家使⽤相對路徑。因爲在我們把程序拷⻉給別⼈使⽤的時候,直接把項⽬拷⻉走就能運⾏。但是如果⽤絕對路徑,則還需要拷⻉外部的⽂件。

讀取文件的方法:

** 1. read() **將⽂件中的內容全部讀取出來。 弊端: 佔內存。如果⽂件過⼤,容易導致內存崩潰。
** 2. read(n) **讀取n個字符. 需要注意的是如果再次讀取,那麼會在當前位置繼續去讀而不
是從頭讀, 如果使⽤的是rb模式. 則讀取出來的是n個字節。

read(n):

f = open("我的詞.txt", mode="r",encoding="utf-8")
content = f.read(3)
print(content)

結果:
在這裏插入圖片描述

再次讀取:

f = open("我的詞.txt", mode="r", encoding="utf-8")
content = f.read(3)
content2 = f.read(3)
print(content)
print(content2)

結果:
在這裏插入圖片描述

rb模式

f = open("我的詞.txt", mode="rb")
content = f.read(3)
print(content)

結果如下:
在這裏插入圖片描述
** 3. readline() **⼀次讀取⼀⾏數據, 注意: readline()結尾, 注意每次讀取出來的數據都會有⼀
個\n ,所以需要我們使⽤strip()⽅法來去掉\n或者空格,下面的例子用了一個,以示區別。

readline()

f = open("我的詞.txt", mode="r", encoding="utf-8")
content = f.readline().strip()
content2 = f.readline()
content3 = f.readline()
content4 = f.readline()
content5 = f.readline()
content6 = f.readline()
print(content)
print(content2)
print(content3)
print(content4)
print(content5)
print(content6)

運行結果:
在這裏插入圖片描述
** 4. readlines()**將每⼀⾏形成⼀個元素, 放到⼀個列表中將所有的內容都讀取出來。所以
也是.容易出現內存崩潰的問題,不推薦使⽤。

f = open("我的詞.txt", mode="r", encoding="utf-8")
lst = f.readlines()
print(lst)
for line in lst:
 print(line.strip())

結果:
在這裏插入圖片描述
5. 循環讀取 這種⽅式是最好的, 每次讀取⼀⾏內容不會產⽣內存溢出的問題。

f = open("我的詞.txt", mode="r", encoding="utf-8")
for line in f:
 print(line.strip())
f.close()

**注意:**讀取完的⽂件句柄⼀定要關閉, f.close()

三. 寫模式(w, wb)

寫的時候注意:如果沒有⽂件則會創建⽂件, 如果⽂件存在,則將原件中原來的內容刪除, 再
寫入新內容

f = open("天龍八部", mode="w", encoding="utf-8")
f.write("段譽之六脈神劍,蕭峯之降龍十八掌,虛竹之逍遙派武功")
f.flush() # 刷新,要養成好習慣
f.close()

結果:
在這裏插入圖片描述
試着讀一下?

f = open("天龍八部", mode="w", encoding="utf-8")
f.write("段譽之六脈神劍,蕭峯之降龍十八掌,虛竹之逍遙派武功")
f.read() # not readable,模式是w,不可以執⾏讀操作
f.flush() # 刷新. 養成好習慣
f.close()

結果報錯,模式是w,操作系統不可以執⾏讀操作:
在這裏插入圖片描述

四. 追加(a, ab)

在追加模式下我們寫入的內容會追加在⽂件的結尾:

f = open("天龍八部", mode="a", encoding="utf-8")
f.write("北冥神功")
f.flush() # 刷新. 養成好習慣
f.close()

結果:
在這裏插入圖片描述

五. 讀寫模式(r+, r+b)

對於讀寫模式必須是先讀,因爲默認光標是在開頭的,準備讀取的,當讀完了之後再進⾏
寫入,我們以後使⽤頻率最⾼的模式就是r+
正確操作是:

f = open("天龍八部", mode="r+", encoding="utf-8")
content = f.read()
f.write("小無相功")
print(content)
f.flush()
f.close()

結果:

在這裏插入圖片描述
在這裏插入圖片描述

敲黑板:記住: r+模式下必須是先讀取,然後再寫入

六. 寫讀(w+, w+b)

先將所有的內容清空,然後寫入,最後讀取,但是讀取的內容是空的,不常⽤,w+ 模式下, ⼀開始讀取不到數據,然後寫的時候再將原來的內容清空, 所以很少⽤。

f = open("天龍八部", mode="w+", encoding="utf-8")
f.write("流螢斷續光")
content = f.read()
print(content)

結果:
在這裏插入圖片描述

七. 追加讀(a+)

a+模式下, “大理段氏”可以追加寫入文件,但是不論先讀還是後讀,都是讀取不到數據的:
在這裏插入圖片描述

八. 其他相關操作

  1. 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()

結果:
在這裏插入圖片描述
2. 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()

結果:
在這裏插入圖片描述
3. truncate() 截斷⽂件

f = open("天龍八部", mode="w", encoding="utf-8")
f.write("哈哈") # 寫⼊兩個字符
f.seek(3) # 光標移動到3, 也就是兩個字中間
f.truncate() # 刪掉光標後⾯的所有內容
f.close()

結果:
在這裏插入圖片描述
再敲黑板:
深坑請注意: 在r+模式下,如果讀取了內容,不論讀取內容多少,光標顯⽰的是多少,再寫入或者操作⽂件的時候都是在結尾進⾏的操作。所以如果想做截斷操作,一定要記住了:要先挪動光標到你想要截斷的位置,然後再進⾏截斷。

題外話

這幾日新型冠狀病毒肆虐,這場病毒蔓延了我們的整個國家,很多城,縣,鄉,村都封閉了,我們非專業醫護人員,沒有救死扶傷的醫學本領,老實呆在家便是對國家最大的支持。事已發生,希望我們不要抱怨那些武漢同胞,我們只有默默的關注,默默的支持,在這種特殊階段,不走親訪友,出門戴口罩,儘量不去人羣密集地,不惡意散播病毒。希望我們的國家能快點度過這次劫難,感謝那些偉大的醫護人員的無私奉獻和偉大付出,相信經過此次經歷,我們更多的年輕人能更清醒的認識到自己的責任與擔當。武漢加油!中國加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章