文件的基本操作 文件讀寫: 文件的讀寫滿足以下3個步驟: 1).打開文件 2).操作數據(讀、寫) 3).關閉文件 --> 不要忘記 1).打開文件: python的open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSErr ...
文件的基本操作
文件讀寫:
文件的讀寫滿足以下3個步驟:
1).打開文件
2).操作數據(讀、寫)
3).關閉文件 --> 不要忘記
1).打開文件:
python的open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。
【註意】:使用 open() 方法一定要保證關閉文件對象,即調用 close() 方法。
1 # open() 函數常用形式是接收兩個參數:文件名(file)和模式(mode) 2 open(file, mode='r') 3 4 # 完整的語法格式為: 5 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
- file: 必需,文件路徑(相對或者絕對路徑)
- mode: 可選,文件打開模式
- buffering: 設置緩衝
- encoding: 一般使用utf-8,確定字元集(編碼、解碼);如果不定義,預設使用gbk進行編碼和解碼使用
- errors: 編碼解碼不一致報錯時會報錯,如果定義errors = 'ignore',不會報錯但是會亂碼,(相對友好)
- newline: 區分換行符
- closefd: 傳入的file參數類型
- opener:
不同模式打開文件的完全列表(即mode參數有類型):
t | 文本模式 (預設)。 |
x | 寫模式,新建一個文件,如果該文件已存在則會報錯。 |
b | 二進位模式。 |
+ | 打開一個文件進行更新(可讀可寫)。 |
U | 通用換行模式(不推薦)。 |
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是預設模式。 |
rb | 以二進位格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是預設模式。一般用於非文本文件如圖片等。 |
r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ | 以二進位格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。 |
w | 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb | 以二進位格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
w+ | 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb+ | 以二進位格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
a | 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
ab | 以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
a+ | 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
ab+ | 以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
File對象的屬性:
一個文件被打開後,會返回一個file對象,你可以得到有關該文件的各種信息。
1.file.closed:返回true如果文件已被關閉,否則返回false。
2.file.mode:返回被打開文件的訪問模式。
3.file.name:返迴文件的名稱。
4.file.softspace:如果用print輸出後,必須跟一個空格符,則返回false。否則返回true。
1 # 打開一個文件 2 fo = open("foo.txt", "w") 3 4 print(fo.name) # 文件名: foo.txt
5 print(fo.closed) # 是否已關閉:False
6 print(fo.mode) # 訪問模式: w 7 print(fo.softspace) # 末尾是否強制加空格: 0
2).讀寫文件:
file對象提供了一系列方法,能讓我們的文件訪問更輕鬆。
1.read([size]):從文件讀取指定的字元數,如果未給定或為負則讀取所有。
2.readline([size]):從文件中的一行讀取指定的字元數,如果未給定則讀取整行,包括 "\n" 字元。(以字元串的形式返回)
3.readlines():讀取所有行並返回列表,若給定sizeint>0,則是設置一次讀多少字元,這是為了減輕讀取壓力。(返回列表)
4.tell():返迴文件當前位置(返迴文件描述符所定位到的已讀位元組數),註意是位元組。
5.seek(num):設置文件當前位置(將文件描述符回到num個位元組位置),註意是位元組。
6.write(str):將字元串寫入到文件中,python字元串可以是二進位數據,而不是僅僅是文字。
7.writelines(seq):向文件中寫入一序列的字元串,把seq的內容全部寫到文件中(多行一次性寫入)。
演示讀操作:
1 # 假設a.txt文件中的內容是 abcdefg1234567 2 3 path = r'D:\python\project\文件讀寫\a.txt' 4 5 # 1.打開文件 6 fr = open(path,'r') 7 8 # 2.讀取文件中的數據 9 print(fr.read(3)) # 得到 abc 讀的是字元 10 print(fr.read(4)) # 得到 defg 讀的是字元 11 print(fr.read()) # 得到 1234567(讀取剩餘的所有) 12 13 # tell():返回已讀的位元組數 14 print(fr.tell()) #接上面的代碼的到 14 15 16 # seek(num):將文件描述符移動到num位元組位,返回新的文件位置,從num位元組位開始 17 fr.seek(4) # 表示起始位置從第四位後面的開始 18 print(fr.read()) #得到efg1234567 19 20 # 3.關閉文件 21 fr.close()
演示read()、tell()、seek()此三個函數參數&返回值的理解
1 #假設b.txt文件中的內容是 哈哈呵呵嘿嘿 2 3 path = r'b.txt' 4 5 fr = open(path,'r',encoding='gbk') # 以gbk的方式進行解碼 6 7 #read(num): num記錄的是字元數 8 print(fr.read(2)) # 得到 哈哈 9 10 #tell():返回已讀的位元組數 註意:不是字元 11 print(fr.tell()) # 得到 4 12 13 print(fr.read()) # 將內容全部讀完 呵呵嘿嘿 14 15 print(fr.tell()) # 得到 12 16 17 # seek(num):num記錄了位元組數 18 fr.seek(4) # 標識符停在第二個‘哈’上 19 print(fr.read()) # 得到 呵呵嘿嘿 20 21 # 以下代碼會報錯,相當於停在第三個位元組上,把第二個哈字一分為二,不可以(一個漢字是占兩個位元組) 22 # fr.seek(3) 23 # print(fr.read()) 24 25 fr.close()
演示寫操作:
1 # 打開一個文件 2 fo = open("foo.txt", "w") 3 # 寫入內容 4 fo.write( "www.runoob.com!\nVery good site!\n") 5 6 # 關閉打開的文件 7 fo.close() 8 9 # *******文件內容********* 10 www.runoob.com! 11 Very good site! 12
【註意】:write()的特點
1).如果需要寫入的文件並不存在,先創建文件,再寫入數據
2).'w' 操作不能追加數據到文件中,只能覆蓋之前的內容
3).'a' 表示追加字元(保留原本的,不會覆蓋掉)
4).write()沒有自動換行的功能,所以用\n
【補充】:讀取文件的三個方法:read()、readline()、readlines()的對比
1 # read()方法讀取整個文件,將文件內容放到一個字元串變數中。如果文件非常大,尤其是大於記憶體時,無法使用read()方法。 2 # readline()方法每次讀取一行;返回的是一個字元串對象,保持當前行的記憶體,但是比readlines慢得多。 3 # readlines()方法一次性讀取整個文件;自動將文件內容分析成一個行的列表,文件大時占記憶體。 4 5 # 兩種文件的遍歷方法比較,for迴圈 6 # 法一: 7 for line in open('myfile.txt','r').readlines(): 8 print(line,end='') 9 10 # 法二 11 for line in open('myfile.txt','r'): 12 print(line,end='') 13 14 15 # 兩種方法的運行結果是一樣的,但是實際有很大的區別:
16 # 法一通過readlines一次性把文件載入到行字元串列表中,然後再對字元串列表進行迭代;
17 # 法二運行的原理有所不同,它並非一次性將所有的內容載入到記憶體中,而是在迭代的時候,迴圈到哪一行才將哪一行讀入到記憶體的,
18 # 這裡涉及到迭代器。因此在這裡法二是文本文件讀取的最佳選擇,簡單,且對任意大小的文件都有效,不會產生記憶體壓力過大的問題。
3).關閉文件:
file對象的close()方法刷新緩衝區里任何還沒寫入的信息,並關閉該文件,這之後便不能再進行寫入。
當一個文件對象的引用被重新指定給另一個文件時,Python 會關閉之前的文件。用 close()方法關閉文件是一個很好的習慣。
1 # 關閉打開的文件 2 fo.close()
強大的文件操作之shutil模塊
pyhton的shutil模塊是一個高級的文件,文件夾,壓縮包的處理模塊,它提供了一些針對文件和目錄的高級操作,主要是拷貝、移動。對於單個文件的操作,還可參考os模塊。
Warning: 即使是高級別的拷貝函數(shutil.copy(),shutil.copy2())也不能拷貝所有的文件元數據。意思是:在POSIX系統中,文件所有者、屬組以及ACL信息會丟失。在Windows平臺上,文件所有者,ACL以及ADS(供選數據流)不會被覆制。
shutil模塊常見的方法:
1.shutil
.copy(
"oldfile"
,
"newfile"
):
拷貝文件的內容和許可權位,newfile可以是文件或目錄;copy()使用copymode()拷貝許可權位,使用copyfile()拷貝文件內容
2.shutil.copy2(
"oldfile"
,
"newfile"
):拷貝文件和狀態信息;copy2()使用copystat()拷貝元數據,使用copyfile()拷貝文件內容,複製後的結果保留了原來的所有信息(包括狀態信息)
3.shutil
.copyfile(
"oldfile"
,
"newfile"
):拷貝(複製)文件,oldfile和newfile都只能是文件,
如果newfile不存在則自動創建;特殊文件比如塊設備、字元設備、管道不能使用此函數複製
4.shutil.copyfileobj(fsrc,fdst[,length]):將一個文件的內容拷貝的另外一個文件當中,可以指定length長度進行拷貝(不常用)
5.shutil.copymode(src,dst):僅拷貝許可權,內容、組、用戶均不變(不常用)
6.shutil.copystat(src,dst):拷貝狀態的信息,包括:mode bits,atime,mtime,flags(不常用)
7.shutil.copytree("olddir","newdir"):複製整個文件夾(目錄),無論文件夾是否為空,均可以複製,而且會複製文件夾中的所有內容,olddir和newdir都只能是目錄,且newdir必須不存在,若newdir文件夾已經存在,就會返回一個FileExistsError錯誤
8.shutil.move("oldpos","newpos"):移動文件/重命名文件
9.shutil.rmtree(
"dir"
):
刪除文件夾(目錄),空目錄、有內容的目錄都可以刪(
刪除的是文件夾)
【補充】:
os.mkdir("file"): 創建目錄
os.rename("oldname","newname"):重命名文件(目錄),文件或目錄都是使用這條命令
os.remove("file"): 刪除文件
os.rmdir("dir"): 刪除目錄,只能刪除空目錄
os.chdir("path") : 轉換目錄,換路徑
1 import shutil 2 3 shutil.copy("src.txt", "dst.txt") # 輸出 'dst.txt' 4 shutil.copy("src.txt", "/tmp/") # 輸出 '/tmp/src.txt' 5 shutil.copy("src.txt", "/Dota2/") # 傳入一個不存在的目錄,出現IsADirectoryError: 6 7 shutil.copy2("src.txt", "dst.txt") 8 9 shutil.copyfile("src.txt", "dst.txt") 10 11 shutil.copyfileobj(open("fsrc.txt", "rb"), open("fdst.txt", "wb")) 12 shutil.copymode('f1.log', 'f2.log') 13 shutil.copystat('f1.log', 'f2.log') 14 15 shutil.copytree('folder1', 'folder2') # 如果folder2文件夾已經存在,就會返回一個FileExistsError錯誤 16 17 shutil.rmtree('folder1') # 刪除文件夾folder1 18 19 # 移動文件/重命名文件 shutil.move()
20 shutil.move('E:\\first\\123.txt', 'E:\\second') # 移動文件,輸出結果'E:\\second\\123.txt' 21 shutil.move('E:\\first\\123.txt', 'E:\\first\\aaa') # 重命名文件,輸出結果'E:\\first\\aaa'
演示os.chdir("path") :
1 # 使用os模塊,將當前工作目錄設置在E盤 2 3 #假設當前路徑 C:\\Users\\first 4 5 import os 6 7 os.chdir('E:\\') # 換路徑 8 9 os.getcwd() # 即可看到輸出結果為 'E:\\'