一、檔案的操作
? 檔案路徑:D:\test1.txt (你想操作這個檔案,必須要知道這個檔案的位置)
? 編碼方式:utf-8,gbk,gb2312.... (昨天剛講完編碼,檔案其實就是資料的存盤,資料存盤你需要編碼知道這個資料是以什么編碼存盤的)
? 操作模式:只讀,只寫,追加,寫讀,讀寫....
f1 = open('D:\\test1.txt', encoding='utf-8', mode='r')
content = f1.read()
print(content)
f1.close()
接下來就是對上面代碼的解釋:
f1: 就是一個變數,一般都會將它寫成f,f_obj,file,f_handler,fh,等,它被稱作檔案句柄,
open:是Python呼叫的作業系統(windows,linux,等)的功能,
'd:\test1.txt': 這個是檔案的路徑,
mode: 就是定義你的操作方式:r為讀模式,
encoding: 不是具體的編碼或者解碼,他就是宣告:此次打開檔案使用什么編碼本,一般來說:你的檔案用什么編碼保存的,就用什么方法打開,一般都是用utf-8(有些使用的是gbk),
f.read():你想操作檔案,比如讀檔案,給檔案寫內容,等等,都必須通過檔案句柄進行操作,
close(): 關閉檔案句柄(可以把檔案句柄理解成一個空間,這個空間存在記憶體中,必須要主動關閉),
檔案操作三部曲:
-
打開檔案
-
對檔案句柄進行相應操作
-
關閉檔案
報錯原因'
- 路徑問題,


? 這個是沒有找到該檔案,很可能是你的檔案路徑錯了,
? 路徑里面的\與后面的字符\D此時\就不是路徑分隔符了,\D就有了特殊意義,其實跟\t,\n,換行符一樣
**解決方式一**: f1 = open('D:\\\test1.txt', encoding='utf-8', mode='r')
? 解決方式二:f1 = open(r'D:\test1.txt', encoding='utf-8',)
? 解決方式三:f = open('D:/test1.txt',encoding='utf8',mode='r')
-
編碼的問題
UnicodeDecodeError 檔案存盤時與檔案打開時的編碼本運用不一致
二、檔案讀操作
1) r模式
以只讀方式打開檔案,檔案的指標將會放在檔案的開頭,是檔案操作最常用的模式,也是默認模式,如果一個檔案不設定mode,那么默認使用r模式操作檔案,
f1 = open('aa.py', encoding='utf=8', mode='r')
content = f1.read()
print(content)
f1.close()
結果:
詳情請看:
www.tom.com
高圓圓
劉亦菲
張柏芝
楊紫
王菲
- read()
read()將檔案中的內容全部讀取出來;弊端 如果檔案很大就會非常的占用記憶體,容易導致記憶體奔潰.
f1 = open('aa.py', encoding='utf=8', mode='r')
content = f1.read()
print(content)
f1.close()
結果:
詳情請看:
www.tom.com
高圓圓
劉亦菲
張柏芝
楊紫
王菲
-
read(n)
read()讀取的時候指定讀取到什么位置
? 在r模式下,n按照字符讀取,
f1 = open('aa.py', encoding='utf=8', mode='r')
content = f1.read(5)
print(content)
f1.close()
結果:
詳情請看:
- readline()
readline()讀取每次只讀取一行,注意點:readline()讀取出來的資料在后面都有一個\n
f1 = open('aa.py', encoding='utf=8', mode='r')
print(f1.readline())
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()
結果:
詳情請看:
www.tom.com
高圓圓
劉亦菲
解決這個問題只需要在我們讀取出來的檔案后邊加一個strip()就OK了
f1 = open('aa.py', encoding='utf=8', mode='r')
print(f1.readline().strip())
print(f1.readline().strip())
print(f1.readline().strip())
print(f1.readline().strip())
print(f1.readline().strip())
print(f1.readline().strip())
f1.close()
結果:
詳情請看:
www.tom.com
高圓圓
劉亦菲
張柏芝
楊紫
- **readlines() **
readlines()回傳一個串列,串列中的每個元素是源檔案的每一行,如果檔案很大,占記憶體,容易崩盤,
f1 = open('aa.py', encoding='utf=8', mode='r')
print(f1.readlines())
f1.close()
結果:
['詳情請看:\n', 'www.tom.com\n', '高圓圓\n', '劉亦菲\n', '張柏芝\n', '楊紫\n', '王菲']
- for回圈
可以通過for回圈去讀取,檔案句柄是一個迭代器,他的特點就是每次回圈只在記憶體中占一行的資料,非常節省記憶體,
f1 = open('aa.py', encoding='utf=8', mode='r')
for line in f1:
print(line)
f1.close()
結果:
詳情請看:
www.tom.com
高圓圓
劉亦菲
張柏芝
楊紫
王菲
with open('d:/test1.txt', encoding='utf-8', mode='r') as f1:
for i in f1:
print(i.strip())
f1.close()
結果:
詳情請看:
www.tom.com
高圓圓
劉亦菲
張柏芝
楊紫
王菲
2)rb模式
操作的是非文本的檔案:圖片、視頻、音頻

rb模式也有read read(n) readline(),readlines() for回圈這幾種方法
with open('timg.jpg', mode='rb') as f1:
print(f1.read())
f1.close()
結果:
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x02\x00\x00d\x00d\x00\......
三. 檔案操作:寫
1)w模式
如果檔案不存在,利用w模式操作檔案,那么它會先創建檔案,然后寫入內容.
f = open('test.txt',encoding='utf-8',mode='w')
f.write('hello world!')
f.flush() #強制保存
f.close()

,利用w模式操作檔案,先清空原檔案內容,在寫入新內容,**

2)wb
主要用于非文本檔案如:圖片,音頻,視頻等,
舉例說明:
? 我先以rb的模式將一個圖片的內容以bytes型別全部讀取出來,然后在以wb將全部讀取出來的資料寫入一個新檔案,這樣我就完成了類似于一個圖片復制的流程,具體代碼如下:
timg = open('timg.jpg', mode='rb')
aa = timg.read()
timg.close()
timg2 = open('timg2.jpg', mode='wb')
timg2.write(aa)
timg2.flush()
timg2.close()

四. 檔案操作:追加
? 追加,就是在檔案中追加內容,這里也有四種檔案分類主要四種模式:a,ab,a+,a+b,我們只講a,
-
a模式
? 打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,也就是說,新的內容將會被寫入到已有內容之后,如果該檔案不存在,創建新檔案進行寫入,
如果檔案不存在,利用a模式操作檔案,那么它會先創建檔案,然后寫入內容,
f = open('aa.py',encoding='utf-8',mode='a')
f.write('\n在后面追加一些內容') #以字串的型別寫入
f.close()

如果檔案存在,利用a模式操作檔案,那么它會在檔案的最后面追加內容,
f = open('aa.py',encoding='utf-8',mode='a')
f.write('\n在后面追加一些內容') #以字串的型別寫入
f.close()
五. 檔案操作的其他模式
-
檔案讀寫
r+ 讀寫模式,w+寫讀模式,a+寫讀模式,r+b 以bytes型別的讀寫模式.........
#1. 打開檔案的模式有(默認為文本模式): r ,只讀模式【默認模式,檔案必須存在,不存在則拋出例外】 w,只寫模式【不可讀;不存在則創建;存在則清空內容】 a, 只追加寫模式【不可讀;不存在則創建;存在則只追加內容】 #2. 對于非文本檔案,我們只能使用b模式,"b"表示以位元組的方式操作(而所有檔案也都是以位元組的形式存盤的,使用這種模式無需考慮文本檔案的字符編碼、圖片檔案的jgp格式、視頻檔案的avi格式) rb 非文本檔案只讀模式 wb 非文本檔案只寫模式 ab 非文本檔案只追加模式 注:以b方式打開時,讀取到的內容是位元組型別,寫入時也需要提供位元組型別,不能指定編碼 #3,‘+’模式(就是增加了一個功能) r+, 讀寫【可讀,可寫】 w+,寫讀【可寫,可讀】 a+, 寫讀【可寫,可讀】 #4,以bytes型別操作的讀寫,寫讀,寫讀模式 r+b, 讀寫【可讀,可寫】 w+b,寫讀【可寫,可讀】 a+b, 寫讀【可寫,可讀】r+: 打開一個檔案用于讀寫,檔案指標默認將會放在檔案的開頭,
下面代碼示例中,如果aa.py檔案里有空格、符號等,再進行讀寫檔案時會報錯,
f = open('aa.py', encoding='utf-8', mode='r+') f.write('燕郊') # 以字串的型別寫入 conten=f.read() print(conten) f.close() 結果: 燕郊請看: 中國中國中國中國中國中國中國中國河北河北河北f = open('aa.py',encoding='utf-8',mode='r+') content=f.read() print(content) f.write('中國中國') #以字串的型別寫入 f.close()解決方法:
默認打開檔案游標開頭, 我們把游標移動最后,再寫入相關內容就不會報錯
with open('aa.py',encoding='utf-8',mode='r+') as f1: print(f1.seek(0,2)) f1.write('美國') print(f1.read()) f1.close()
注意:如果你在讀寫模式下,先寫后讀,那么檔案就會出問題,因為默認游標是在檔案的最開始,你要是先寫,則寫入的內容會講原內容覆寫掉,直到覆寫到你寫完的內容,然后在后面開始讀取,
六. 檔案操作的其他功能
tell()
使用tell()可以幫我們獲取當前游標在什么位置
l1 = open('aa.py',encoding='utf-8',mode='r')
print(l1.tell())
l1.read()
print(l1.tell())
l1.close()
結果:
0
8
seek()
seek(n)游標移動到n位置,注意: 移動單位是byte,所有如果是utf-8的中文部分要是3的倍數
通常我們使用seek都是移動到開頭或者結尾
移動到開頭:seek(0)
移動到結尾:seek(0,2) seek的第二個引數表示的是從哪個位置進行偏移,默認是0,表示開頭,1表示當前位置,2表示結尾
調整游標的位置
l1 = open('aa.py',encoding='utf-8',mode='r')
print(l1.seek(2))
print(l1.read())
l1.close()
結果:
2
中國
flush()
強制保存
f = open('aa.py',encoding='utf-8',mode='r+')
print(f.read())
f.write('hello world!++++++')
f.flush() #強制保存
f.close()
七. 打開檔案的另一種方式
**with open() as .... **
# 1,利用with背景關系管理這種方式,它會自動關閉檔案句柄,
with open('t1',encoding='utf-8') as f1:
f1.read()
# 2,一個with 陳述句可以操作多個檔案,產生多個檔案句柄,
with open('t1',encoding='utf-8') as f1,\
open('Test', encoding='utf-8', mode = 'w') as f2:
f1.read()
f2.write('中國中國')
優點:不用手動關閉檔案句柄,它會在一定時間內自動關閉
缺點:
八. 檔案的修改
方式一:將硬碟存放的該檔案的內容全部加載到記憶體,在記憶體中是可以修改的,修改完畢后,再由記憶體覆寫到硬碟(word,vim,nodpad++等編輯器)
import os
with open('aa.py', encoding='utf-8', mode='r') as f1, \
open('aa.bak', encoding='utf-8', mode='w') as f2:
old_content = f1.read()
new_content = old_content.replace('python', 'linux')
f2.write(new_content)
os.remove('aa.py')
os.rename('aa.bak', 'aa.py')
方式二:將硬碟存放的該檔案的內容一行一行地讀入記憶體,修改完畢就寫入新檔案,最后用新檔案覆寫源檔案
import os
with open('aa.py', encoding='utf-8', mode='r') as f1, \
open('aa.bak', encoding='utf-8', mode='w') as f2:
for line in f1:
new_line = line.replace('python','linux')
f2.write(new_line)
os.remove('aa.py')
os.rename('aa.bak','aa.py')
半閉檔案句柄,再次以w模式打開此檔案時才會清空
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110812.html
標籤:Python
下一篇:day8__作業(重點)
