Python筆記·第七章—— IO(文件)處理
一、文件處理簡介
計算機系統分為:計算機硬件,操作系統,應用程序三部分。
我們用python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件,眾所周知,應用程序是無法直接操作硬件的,這就用到了操作系統。操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用,其中文件就是操作系統提供給應用程序來操作硬盤虛擬概念,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來。
有了文件的概念,我們無需再去考慮操作硬盤的細節,只需要關註操作文件的流程:
#1. 打開文件,得到文件句柄並賦值給一個變量 #2. 通過句柄對文件進行操作 #3. 關閉文件
二、打開文件的方法
① f = open(‘文件名‘ , ‘操作模式‘ , ‘編碼格式’) 如:
f = open(‘test.txt‘,‘r‘,encoding=‘utf-8‘)
註意:用這種方法打開文件,用完之後一定要調用f.close()方法將其關閉
②with open(‘文件名‘ , ‘操作模式‘ , ‘編碼格式’) as f 如:
with open(‘day8.txt‘,‘w‘,encoding=‘utf-8‘) as f:
註意:用這種方法打開文件,處理完後會自動關閉文件,但是處理的段落要進行縮進
三、操作文件的幾種模式
四、處理文件的幾種方法
示例文件如下:
△讀文件:
read( )
讀取整個文件
1 with open(‘love.txt‘,‘r‘,encoding=‘utf-8‘) as f: 2 msg = f.read() 3 print(msg)
read( int )
read()方法可以指定讀取的字符數,註意,是字符數,不是字節數,如下:
1 with open(‘love.txt‘,‘r‘,encoding=‘utf-8‘) as f: 2 msg = f.read() 3 print(msg)
#結果為‘一生所’
readline( )
可以讀取一行,如下:
1 with open(‘love.txt‘,‘r‘,encoding=‘utf-8‘) as f: 2 msg = f.readline() 3 print(msg)
#結果是 ‘一生所愛’
readlines( )
可以讀取整篇文章,並且將每一行都作為一個元素添加到一個列表中,如下:
with open(‘love.txt‘,‘r‘,encoding=‘utf-8‘) as f: msg = f.readlines() print(msg) #結果是:[‘一生所愛\n‘, ‘演唱:盧冠庭\n‘, ‘從前現在過去了再不來\n‘, ‘紅紅落葉長埋塵土內\n‘, ‘開始終結總是沒變改\n‘, ‘天邊的你飄泊白雲外\n‘, ‘苦海翻起愛恨\n‘, ‘在世間難逃避命運\n‘, ‘相親竟不可接近\n‘, ‘或我應該相信是緣份‘]
for lin in f :
可以用循環的方法直接讀取每一行。f 是一個可叠代對象
1 with open(‘love.txt‘,‘r‘,encoding=‘utf-8‘) as f: 2 for line in f: 3 print(line,end=‘‘) 4 #結果是: 5 # 一生所愛 6 # 演唱:盧冠庭 7 # 從前現在過去了再不來 8 # 紅紅落葉長埋塵土內 9 # 開始終結總是沒變改 10 # 天邊的你飄泊白雲外 11 # 苦海翻起愛恨 12 # 在世間難逃避命運 13 # 相親竟不可接近 14 # 或我應該相信是緣份
△寫文件:
write( str )
可以指定寫入模式,如果文件不存在,重新創建一個,如果已經存在,w模式下會將之前的文字覆蓋,重新寫入,a模式是在結尾處追加。
1 with open(‘love.txt‘,‘w‘,encoding=‘utf-8‘) as f: 2 f.write(‘這段話會覆蓋之前的文章‘)
3 with open(‘love.txt‘,‘a‘,encoding=‘utf-8‘) as f:
4 f.write(‘這段話不會覆蓋之前的文章‘)
△光標的移動
seek( )
語法為:fileObject.seek(offset, whence)
-
offset -- 開始的偏移量,也就是代表需要移動偏移的字節數,註意,是字節數,負數表示像前移動
-
whence:可選,默認值為 0。給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。
1 with open(‘love.txt‘,‘r‘,encoding=‘utf-8‘) as f: 2 print(f.read(3)) #讀取3個字符 : 一生所 3 f.seek(3) #光標從起點向後移3個字節(1個中文) 4 print(f.read(3)) #再從前面的基礎上開始讀:生所愛
tell( )
可以獲取當前光標位置,返回的是字節數
△截取文件
truncate()
此方法是截取文件,註意,是直接對原文件進行截取。參數是填一個字節數,如下:
1 with open(‘love.txt‘,‘r+‘,encoding=‘utf-8‘) as f: 2 f.truncate(9) #截取9個字節,就是3個中文 3 print(f.read()) #再讀取的內容結果為:一生所 3個字
五:課後練習(註冊,登錄小系統)
1 #用戶註冊,將用戶名以及密碼存在文件裏,然後驗證登錄信息,給3次機會 2 print(‘*************註冊信息*************‘) 3 while 1: 4 username = input(‘請輸入您的用戶名:‘).strip() 5 password = ‘‘ 6 password1 = input(‘請輸入您的註冊密碼:‘).strip() 7 password2 = input(‘請再次輸入您的註冊密碼:‘).strip() 8 if password1 == password2: 9 print(‘恭喜您,註冊成功!‘) 10 password = password1 11 break 12 else: 13 print(‘您兩次輸入的密碼不同,請重新輸入!‘) 14 with open(‘day8.txt‘,‘w‘,encoding=‘utf-8‘) as f1: 15 16 # f1.write(‘{%s:%s}‘%(username,password)) 17 f1.write(‘%s:%s‘%(username,password)) 18 19 print(‘*************登錄信息*************‘) 20 21 count = 3 22 with open(‘day8.txt‘,‘r‘,encoding=‘utf-8‘) as f2: 23 user_list = f2.read().split(‘:‘) 24 25 # print(user_list) 26 while count > 0 : 27 username = input(‘請輸入您的用戶名:‘).strip() 28 password = input(‘請輸入您的密碼:‘).strip() 29 if username == user_list[0] and password == user_list[1]: 30 print(‘恭喜您,登陸成功!‘) 31 break 32 else: 33 count -= 1 34 print(‘登錄失敗,請重新輸入!您還有%s次機會‘%count)
Python筆記·第七章—— IO(文件)處理