第10課 檔案的讀寫
一、檔案的讀寫
1、檔案的開啟,注意事項
1)路徑要正確
2)格式要帶全(.txt)
filedir = D:\software\HelloWorld\songqin\python\lesson11 檔案的讀寫/test1.txt' # /的好處是避免出現轉義字元 filedir1 = 'd:\software\HelloWorld\songqin/lesson11 檔案的讀寫\\test2.txt' # \的壞處是會出現轉義字元,如\t,可以用\\對\進行轉義 filedir2 = r 'd:\software\HelloWorld\songqin/lesson11 檔案的讀寫\\test3.txt' # 使用 r,可以避免出現\t的情況 fo = open(filedir) # 執行結果 ---檔案操作---
3)讀模式的r可以預設
fileDir = 'D:\software\HelloWorld\songqin\python\lesson11 檔案的讀寫/test1.txt' fo = open(fileDir, 'r') # r可預設 print(fo) # 執行結果 ---檔案操作--- <_io.TextIOWrapper name='D:\\software\\HelloWorld\\songqin\\python\\lesson11 檔案的讀寫/test1.txt' mode='r' encoding='cp936'>
2、絕對路徑:帶碟符---如,C、G
3、相對路徑:
1)當前目錄: ./
2)上一層目錄:.. ../
4、tell()方法:獲取檔案指標位置
fo = open(fileDir, 'r') print(fo.tell()) # 執行結果 ---檔案操作--- 0
5、fo.read(數量):讀檔案
fo = open(fileDir, 'r') print(fo.tell()) # 檔案指標初始位置 fo.read(2) # 讀取兩個字元 print(fo.tell()) # 檔案指標當前位置 # 執行結果 ---檔案操作--- 02
1)返回的型別是--str
fo = open(fileDir, 'r') str1 = fo.read(2) print(type(str1)) # 執行結果 ---檔案操作--- <class 'str'>
2)fo.read()---讀取所有
fo = open(fileDir, 'r') str1 = fo.read() # 讀取全部內容 print(fo.tell()) # 獲取檔案指標位置 print(str1) # 列印讀取到的內容 # 執行結果 ---檔案操作--- 14 123456 abcdef
>>> fo = open('test1.txt') >>> fo.read() '123456\nabcdef'
6、檔案內部的換行符是2個字元長度(windows)--舉例,如上面的\n
7、fo.close():關閉檔案
8、fo.seek(長度):移動檔案指標位置
1)移動到檔案初始位置:fo.seek(0)---0 模式,從頭(0)開始。0為絕對位置,如果當前位置為2,那麼要移動到3的位置,則為seek(3),而不是seek(1)。
fo = open(fileDir, 'r') print('移動前', fo.tell()) fo.seek(2) # 移動位置 print('移動後', fo.tell()) # 執行結果 ---檔案操作--- 移動前 0 移動後 2
fo = open(fileDir, 'r') print('移動前', fo.tell()) fo.seek(2) print('移動後', fo.tell()) fo.seek(0) # seek(0), 又回到初始位置 print('再次移動後', fo.tell()) # 執行結果 ---檔案操作--- 移動前 0 移動後 2 再次移動後 0
2)1模式---從當前位置開始算---一定要是'br'
fo = open(fileDir, 'br') # 1模式,必須用'br' fo.seek(2, 1) print('移動後', fo.tell()) fo.seek(3, 1) print('再次移動後', fo.tell()) # 執行結果 ---檔案操作--- 移動後 2 再次移動後 5
3)2模式:從尾部位置開始算---一定要是'br'。如果從尾部往前移,則要用負數。
fo = open(fileDir, 'br') print('移動前', fo.tell()) fo.seek(1, 2) print('移動後', fo.tell()) fo.seek(-3, 2) print('再次移動後', fo.tell()) # 執行結果 ---檔案操作--- 移動前 0 移動後 15 再次移動後 11
4)seek(長度, 模式)
9、讀一行:fo.readline()---str
fo = open(fileDir, 'r') str1 = fo.readline() print(str1) print(fo.readline()) # 讀取下一行 # 執行結果 ---檔案操作--- 123456
abcedf
10、讀取所有行:fo.readlines()----返回結果是列表
fo = open(fileDir, 'r') print(fo.readlines()) # 返回結果 ---檔案操作--- ['123456\n', 'abcdef']
fo = open(fileDir, 'r') # print(fo.readlines()) print(fo.readlines()[0]) # 獲取結果列表的元素 # 執行結果 ---檔案操作--- 123456
1)舉例:提取文件中的編號
# 提取文件中的編號 11:12:11> 001 enter chatroom, level 2 11:12:13> 003 enter chatroom, level 25
fileDir = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\test.txt' fo = open(fileDir, 'r') #print(fo.readlines()) # 這一句沒注掉,結果一直顯示為列表。因為先執行這一句的話,檔案指標已經在最後一行的末尾。下面的語句讀取不到資料 for str1 in fo.readlines(): print(str1.split(' ')[1]) # 執行結果 001 003
11、fo.read().splitlines()---獲取所有行的同時----去掉所有 \n
fileDir = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\test.txt' # fo.read().splitlines()----獲取所有行的同時---去掉所有\n fo = open(fileDir, 'r') print(fo.read().splitlines()) # 執行結果 ['11:12:11> 001 enter chatroom, level 2', '11:12:13> 003 enter chatroom, level 25']
12、寫模式:w
1)如果該檔案存在,則所有內容被清空。
fileDir1 = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\test1.txt' fo = open(fileDir1, 'w')
2)如果該檔案不存在,則建立該檔案。
fileDir1 = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\pytest.txt' fo = open(fileDir1, 'w')
3)fo.write('123456')---只是儲存在記憶體中
4)fo.flush() / fo.close()---從記憶體寫到磁碟
fo = open(fileDir, 'w') fo.write('Hello Python') # pycharm 裡面這一步自動把內容儲存在硬碟上,如果是idle則會先儲存在記憶體中 fo.close() # 或者fo.flush(),執行這一句,idle才會把資料存在硬碟上 # 執行結果 ---檔案操作---
5)寫入的內容換行用---\n
fo = open(fileDir, 'w') fo.write('123456\nabcdef') # 執行結果 ---檔案操作---
6)print(fo.write('Hello Python')) ----結果有返回值
fo = open(fileDir, 'w') print(fo.write('Hello Python')) # 執行結果 ---檔案操作--- 12
13、a--追加模式--接著已有的內容寫
fo = open(fileDir, 'a') # 目前test1裡面已有的內容--Hello Python print(fo.write('123456\nabcdef')) fo.close() # 執行結果 ---檔案操作--- 13
14、讀寫開啟方式
1)r+:為了讀取並且寫檔案而開啟檔案。如果檔案不存在會報錯,檔案指標在檔案的開始位置。
2)w+:為了讀取並寫檔案而開啟檔案。如果檔案不存在,會建立一個檔案。檔案指標在檔案的開始位置。如果檔案已經存在,其內容將被清空。
3)a+:為了讀取並寫檔案而開啟檔案。如果檔案不存在則建立一個檔案。檔案指標在檔案的結尾,很多OS上寫操作永遠在檔案結尾進行,不管是否用了seek()。所以為了保證內容不被清空,建議最好用a+。
fo = open(fileDir, 'a+') print(fo.write('\nHello Python')) fo.close() # 執行結果 ---檔案操作--- 12
15、with open(fileDir) as fo ===== fo = open(fileDir, 'r'),with open()的優勢
1)可以操作多個檔案
2)會自動執行fo.close()
with open(fileDir, 'r') as rFile, open(fileDir1, 'w') as wFile: #句尾加英文冒號 priint()