計算機操做文件的過程python
#1. 打開文件,獲得文件句柄並賦值給一個變量 #2. 經過句柄對文件進行操做 #3. 關閉文件
1.文件的打開過程算法
# f被程序持有,文件被操做系統持有 f = open('file.txt', 'r', encoding='utf-8') # r讀文件,文件必定要提早存在 #2. 經過句柄對文件進行操做 data=f.read()
#3. 關閉文件 f.close()
f=open('file.txt','r')的過程分析:
#一、由應用程序向操做系統發起系統調用open(...)
#二、操做系統打開該文件,並返回一個文件句柄給應用程序
#三、應用程序將文件句柄賦值給變量fapp
2.操做文件方法ide
# 操做文件 # data = f.read() # 讀全部內容 # print(data) # data = f.read(2) # 讀指定字節數或字符數 # print(data) # d1 = f.read(1) # 在當前位置接着再讀1個字節或字符 # print(d1) # line = f.readline() # 讀取一行 # print(line) # lines = f.readlines() # 按行,將全部行一次一次讀出到list中 # print(lines) # 關閉文件 # f.close() # 操做系統對文件的持有權必定要在文件操做完畢後釋放w = open(r'file.txt', 'w', encoding='utf-8')
w.write('123\n') w.flush() # 數據量過大時,能夠手動將內存中的數據刷新到硬盤中 w.write('456\n') w.writelines(['000\n', '111\n', '222\n']) # 是否可讀可寫 print(w.readable()) print(w.writable()) w.close()
# 文件的遍歷:
# 最經常使用讀寫
with open('source', 'r', encoding='utf-8') as f1, open('target', 'w', encoding='utf-8') as f2:
for line in f1:
f2.write(line)工具
#掌握 f.read() #讀取全部內容,光標移動到文件末尾 f.readline() #讀取一行內容,光標移動到第二行首部 f.readlines() #讀取每一行內容,存放於列表中 f.write('1111\n222\n') #針對文本模式的寫,須要本身寫換行符 f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,須要本身寫換行符 f.writelines(['333\n','444\n']) #文件模式 f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式 #瞭解 f.readable() #文件是否可讀 f.writable() #文件是否可讀 f.closed #文件是否關閉 f.encoding #若是文件打開模式爲b,則沒有該屬性 f.flush() #馬上將文件內容從內存刷到硬盤 f.name
2、文件的操做模式編碼
主模式:
r: 文件必須存在的讀
w: 文件無需存在的寫,無建立,有清空再寫
a: 文件無需存在的寫,無建立,有在文件最後追加寫
從模式:
t: 按文本字符操做數據(默認模式)
b: 按文本字節操做數據
+: 可讀可寫
瞭解:
x:新建文件寫,若是文件已存在,拋異常
#1. 打開文件的模式有(默認爲文本模式): r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】 w,只寫模式【不可讀;不存在則建立;存在則清空內容】 a, 之追加寫模式【不可讀;不存在則建立;存在則只追加內容】 #2. 對於非文本文件,咱們只能使用b模式,"b"表示以字節的方式操做(而全部文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式) rb wb ab 注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼 #3. 瞭解部分 "+" 表示能夠同時讀寫某個文件 r+, 讀寫【可讀,可寫】 w+,寫讀【可讀,可寫】 a+, 寫讀【可讀,可寫】
3.with...open..語法加密
# with open語法 with open('file.txt', 'x', encoding='utf-8') as f: # 不須要明文書寫f.close() # data = f.read() # print(data) print(f.readable()) print(f.writable()) # 追加模式 with open('file.txt', 'a', encoding='utf-8') as f: f.write('123\n') print(123) print(123) f.write('456\n') f.flush() f.write('789\n')
4. 字節方式操做文件spa
""" 你好 好的 123 """ # 注:b操做模式下不須要指定encoding, # 緣由,由於b能夠對全部類型數據進行操做,包含文本/視頻/音頻等各類文件 # 而utf-8只是文本文件的編碼方式 # 數據在硬盤中本就以二進制進行存儲的,全部b默認操做就是對數據從硬盤到內存的拷貝 with open('file.txt', 'rb') as f: data = f.read() print(data) # 但若是數據要展示給用戶,文本文件就要涉及解碼,其餘文件須要經過專業工具打開 print(data.decode('utf-8')) with open('file.txt', 'ab') as f: f.write(b'\n\xe5\x91\xb5\xe5\x91\xb5') # r+: 從頭開始寫, a+:從尾開始寫, w+:清空寫 with open('file.txt', 'rb+') as f: print(f.readable()) print(f.writable()) # print(f.read()) f.write(b'999')
5.遊標操做操作系統
''' 123 你好 456 ''' with open('file.txt', 'w', encoding='utf-8') as f: f.write('123\n你好\n456\n') # 大前提: 遊標操做必定要在b模式下進行操做,由於遊標必定按字節進行偏移 # seek(偏移量, 操做位置) # 操做位置:0,從頭開始 1,從當前位置開始 2,從最後開始 with open('file.txt', 'rt', encoding='utf-8') as f: d1 = f.read(7) print(d1) f.seek(1, 0) d2 = f.read(1) print(d2) # seek()在操做位置爲0時,能夠兼容t模式,但任然按字節進行偏移 with open('file.txt', 'rb') as f: d1 = f.read(14) print(d1) # f.seek(1, 1) # 在當前位置日後偏移1個字節 # f.seek(-1, 1) # 在當前位置往前偏移1個字節 f.seek(-3, 2) # 將鼠標移至到文件末尾,往前偏移3個字節 d2 = f.read(1) print(d2)
6.文件的修改3d
# 文件的修改 """change.txt name:Owen|age:16|gender:God """ # rb+:在當前位置進行覆蓋書寫 with open('change.txt', 'rb+') as f: f.seek(14, 0) print(f.read(2)) # 16 f.seek(-2, 1) f.write(b'16') # ab+:能夠操做遊標,但只對讀起做用,寫任然是最後追加 with open('change.txt', 'ab+') as f: f.seek(14, 0) print(f.read(2)) f.seek(-2, 1) print(f.read(2)) f.write(b'18') with open('change.txt', 'rb+') as f: data = f.read() newData = data.decode('utf-8').replace('16', '016') f.seek(0, 0) f.write(newData.encode('utf-8'))
7.複製文件
# 複製文件 with open('old.txt', 'r', encoding='utf-8') as f1, open('new.txt', 'w', encoding='utf-8') as f2: # 文件的循環 for line in f1: # 對可讀文件對象直接遍歷循環,獲得的是一行行內容 print(line) f2.write(line) import os with open('001.png', 'rb') as f1, open('002.png', 'wb') as f2: for line in f1: f2.write(line) # 按指定路徑將文件刪除 os.remove(r'D:\python週末四期\day03\代碼\001.png')
練習一
# 練習,利用b模式,編寫一個cp工具,要求以下: 1. 既能夠拷貝文本又能夠拷貝視頻,圖片等文件 2. 用戶一旦參數錯誤,打印命令的正確使用方法,如usage: cp source_file target_file # 提示:能夠用import sys,而後用sys.argv獲取腳本後面跟的參數
import sys if len(sys.argv) != 3: print('usage: cp source_file target_file') sys.exit() source_file,target_file=sys.argv[1],sys.argv[2] with open(source_file,'rb') as read_f,open(target_file,'wb') as write_f: for line in read_f: write_f.write(line)
練習二:
#. 文件a.txt內容:每一行內容分別爲商品名字,價錢,個數,求出本次購物花費的總錢數 apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3
做業:
# 做業一: # 讀取⽂文件內容,分析出全部的帳號及對應的密碼 # ⽂文件內容:owen:123456|egon:123qwe|liuxx:000000 # 結果: { 'owen': '123456', 'egon': '123qwe', 'liuxx': '000000' } # 分析:將⽂文件內容讀出,而後按|拆分出 帳號:密碼 格式的⼦子字符串串,再按:拆分紅 帳號及密碼,存放到字典中 #做業二: # 完成登陸註冊系統(從空文件開始作) # 需求分析: ''' 1.能夠循環登陸註冊,輸入1表明選擇登陸功能,輸入2表明註冊功能,輸入0表明退出,其餘輸入表明輸入有誤,重輸 2.用戶的帳號密碼信息存放在usr.txt⽂文件中,保證用戶註冊成功後,重啓系統,用戶信息仍然保存 3.登陸在帳號驗證經過才輸入密碼驗證登陸,帳號驗證三次失敗自動進入註冊功能,登陸三次驗證失敗自動退出系統 4.第一次註冊,文件寫入 帳號:密碼 信息,再次註冊追加寫入 |帳號:密碼 信息
# 做業一 with open('file3.txt','r',encoding='utf-8') as f: dic = [] for line in f: line = line.replace('|',' ') # print(line) for i in line.split(): i = i.split(':') dic.append(i) # print(dic) db_user = dict(dic) print(db_user) # 做業二 #讀取文件,獲取帳號密碼 with open('usr.txt','r',encoding='utf-8') as f: dic = [] for line in f: line = line.replace('|',' ') # print(line) for i in line.split(): i = i.split(':') dic.append(i) # print(dic) db_user = dict(dic) tag = True while tag: print("1-->登陸 2-->註冊 0-->退出") choice = ['0','1','2'] cmd = input("請選擇功能:") if not cmd or cmd not in choice: continue if cmd == '1': #功能判斷 count = 0 while count < 3: username = input("請輸入帳號:").strip() if not username or username not in db_user.keys(): # 判斷帳號是否存在 # print("帳號不存在,是否註冊") continue password = input("請輸入密碼:").strip() if password == db_user[username]: #帳號密碼匹配,登陸成功 print("登陸成功") else: print("帳號密碼錯誤") count += 1 break elif cmd == '2': re_name = input("請輸入帳號:").strip() # 帳號不存在繼續輸入密碼 if re_name not in db_user.keys(): while True: re_pass1 = input("請輸入密碼:") re_pass2 = input("請再次輸入密碼:") if re_pass1 == re_pass2: #2次密碼正確寫入帳號密碼文件 with open('usr.txt','a',encoding='utf-8') as fl: fl.write('|'+ re_name + ':' + re_pass2) print("註冊成功") break else: print("2次輸入的密碼不一致,請從新輸入") else: print("帳號已存在") elif cmd == '0': break
練習三
# 簡單秒傳案例 mk = b"" # 計算獲得秒傳依據 with open('002.png', 'rb') as f: data = f.read() # print(data) length = len(data) print(length) # 設置秒傳算法:1.截取的部分字節,2.加密字節的算法 # 1.從頭開始讀10個字節,中間讀10個字節,末尾讀10個字節 # 2.將全部數據進行拼接 f.seek(0, 0) d1 = f.read(10) f.seek(length // 2, 0) d2 = f.read(10) f.seek(-10, 2) d3 = f.read(10) mk = d1 + d2 + d3 print(mk) # 實現秒傳 with open('200.png', 'rb') as f: new_mk = b'' f.seek(0, 0) new_mk += f.read(10) f.seek(length // 2, 0) new_mk += f.read(10) f.seek(-10, 2) new_mk += f.read(10) if new_mk == mk: print('秒傳') else: print('調用上傳方法,進行龜速上傳') # with open('200.png', 'rb+') as f: # f.seek(-7, 2) # f.write(b'12')