Python全棧-day6-day7
一、字符編碼
1.編碼基礎
定義:人在使用計算機時,使用的是人類能夠讀懂的字符,使用者必須通過一張字符和數字間的相對應關系表實現人機交互,這一系列標準稱為字符編碼
Python應用中解決核心字符串亂碼的最佳方法:用什麽格式編碼,就用什麽格式解碼
參考:http://www.cnblogs.com/linhaifeng/articles/5950339.html#_label2
二、文件處理
1.文件基礎
1)定義
計算機系統分為:計算機硬件,操作系統,應用程序三部分。python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件。實際上,應用程序是無法直接操作硬件的,這就用到了操作系統。操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用,其中文件就是操作系統提供給應用程序來操作硬盤虛擬概念,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來。
2)操作文件的流程:
a.打開文件,得到文件句柄並賦值給一個變量
b.通過句柄對文件進行操作
c.關閉文件
2.Python中文件操作
1)打開文件的過程
# 打開文件,得到文件句柄並賦值給一個變量 f=open(‘test.txt‘,‘r‘,encoding=‘utf-8‘) #默認打開模式就為r,即只讀模式 # 通過句柄對文件進行操作 data=f.read() # 關閉文件 f.close()
打開文件的執行過程:
a.應用程序想操作系統發起系統調用open()請求
b.操作系統打開文件,將文件內容加載到內存中,並返回一個文件句柄給應用程序
c.應用程序將文件句柄賦值給 f
2)open()方法介紹
open(r‘文件路徑‘,mode=‘打開方式‘,encoding=‘編碼格式‘)
r作用:避免文件路徑中的特殊字符例如‘\‘被強制轉義,導致路徑無法識別
打開方式:r/w/a(只讀只寫追加等)
編碼格式:應用程序打開文件時,必須制定其打開的編碼格式,否則有可能出現亂碼
3)文件打開的模式
打開文件的模式有(默認為文本模式): r 只讀模式 默認模式,文件必須存在,不存在則拋出異常 w 只寫模式 不可讀;不存在則創建;存在則清空內容 a 追加寫模式 不可讀;不存在則創建;存在則只追加內容 對於非文本文件,只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,
使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式) rb wb ab 註意:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼 了解部分: + 表示可以同時讀寫某個文件 r+ 讀寫可讀,可寫 w+ 寫讀可讀,可寫 a+ 寫讀可讀,可寫
3.操作文件的方法
讀文件操作:
1)read()
# 讀取文件所有內容,光標移動到文件末尾 f = open(r‘test.txt‘,‘r‘,encoding=‘utf-8‘) prit(f.read()) f.close()
2)readline()、readlines()
# f.readline() 讀取一行內容,光標移動到第二行首部 # f.readlines() 讀取每一行內容,存放於列表中 # 單行讀取文件 print(f.readline()) # 多行讀取,且轉化為列表輸出 print(f.readlines())
3)readable()
# 判斷文件是否可讀 print(f.readable())
讀文件:
1)write()
# 只寫模式 # 註意: # 1.文件存在時,清空原來的內容 # 2.文件不存在是,創建空文件 # 3.默認不會自動換行寫入 f = open(r‘zhang.txt‘,‘w‘,encoding=‘utf-8‘) #默認是wt f.write(‘第一行\n‘) f.write(‘第二行\n‘) # 追加寫的模式 # 註意: # 1.文件存在時,光標移動到文件末尾,且將內容追加到文件默認 # 2.文件不存在是,創建空文件 f = open(r‘zhang.txt‘,‘a‘,encoding=‘utf-8‘) #默認是wt f.write(‘第一行\n‘) f.write(‘第二行\n‘) f.close()
2)其他內置方法
f.writable() #判斷文件是否可讀 f.writelines() #以列表形式,多行寫入
4.練習
1)循環讀取文件
# open(r‘文件路徑‘,mode=‘打開方式‘encoding=‘編碼格式‘) with open(r‘zhang.txt‘,mode=‘r‘,encoding=‘utf-8‘) as file: for line in file: time.sleep(1) print(line,end=‘‘)
2)簡單寫文件,並且實現寫入的新內容總是置於文件末尾
with open(r‘zhang.txt‘,mode=‘a‘,encoding=‘utf-8‘) as file: file.write(‘第一天\n‘)
3)文件打開之b模式
# 1.必須和其它模式組合使用,rb\wb\ab # 2.b模式下讀寫都是以bytes為單位 # 3.b模式下不能指定encoding和decoding模式 # rb模式 with open(r‘120.jpg‘,‘rb‘) as f: data = f.read() print(data) print(type(data)) with open(r‘zhang.txt‘,‘rb‘) as f: data = f.read() print(data) print(data.decode(‘utf-8‘),end=‘‘) print(type(data)) # wb模式 # 不同編碼格式寫入,查看打開出現的情況 with open(r‘120.txt‘,‘wb‘) as f: msg = ‘你是豬嗎?‘ f.write(msg.encode(‘gbk‘)) with open(r‘120.txt‘,‘wb‘) as f: msg = ‘你是豬嗎?‘ f.write(msg.encode(‘utf-8‘)) # ab模式 with open(r‘120.txt‘,‘ab‘) as f: f.write(‘張哈哈‘.encode(‘utf-8‘)) # 可以看出.jpg以bytes的形式被存儲和打開了 with open(r‘120.jpg‘,‘rb‘) as f: for line in f: print(line)View Code
5.作業:文件修改
1)修改文件的實際
# 修改文件方式一: # 1.先把文件全部讀到內存中 # 2.然後在內存中完成修改 # 3.再把修改後的結果覆蓋到源文件中 # 缺點:會在文件內容過大的情況下耗費過多的內存 with open(r‘修改文件.txt‘,‘r‘,encoding=‘utf-8‘) as f: data = f.read() data = data.replace(‘zhang‘,‘你是豬嗎?‘) with open(r‘修改文件.txt‘,‘w‘,encoding=‘utf-8‘) as f: f.write(data) # 修改文件方式二: # 1.以讀的方式打開原文件 # 2.以寫的方式拷貝到新文件 import os with open(r‘修改文件.txt‘,‘rt‘,encoding=‘utf-8‘) as src_f, open(r‘修改文件.txt.swap‘,‘wt‘,encoding=‘utf-8‘) as dst_f: for line in src_f: if ‘你是豬嗎?‘ in line: line = line.replace(‘你是豬嗎‘,‘啊哈哈‘) dst_f.write(line) os.remove(‘修改文件.txt‘) os.rename(‘修改文件.txt.swap‘,‘修改文件.txt‘)View Code
2)實現文件拷貝
rst_file = input(‘原文件路徑>>‘) dst_file = input(‘目標文件路徑>>‘) with open(r‘%s‘ %rst_file,‘rb‘) as src_f, open(r‘%s‘ %dst_file,‘wb‘) as dst_f: for line in src_f: dst_f.write(line)
3)拷貝文件和修改文件程序
# 編寫程序,提供兩種可選功能: # 1)拷貝文件 # 2)修改文件 # 用戶輸入操作的編碼,根據用戶輸入的編號 # 執行文件拷貝(讓用戶輸入原文件路徑和目標文件路徑) # 或修改操作 import os print(‘選擇模式:‘) warm = ‘‘‘ 1 拷貝文件 2 修改文件 輸入quit退出 ‘‘‘ print(warm) while True: choice = input(‘選擇操作>>‘).strip() if choice == ‘1‘: src_file = input(‘輸入原文件路徑>>‘).strip() dst_file = input(‘輸入目標文件路徑>>‘).strip() with open(r‘%s‘ %src_file,‘rb‘) as src, open(r‘%s‘ %dst_file,‘wb‘) as dst: for line in src: dst.write(line) elif choice == ‘2‘: dst_f = input(‘輸入要修改的文件路徑>>‘).strip() msg_old = input(‘輸入要修改的內容>>‘).strip() msg_new = input(‘修改後的內容>>‘).strip() # # 方法一: # with open(r‘%s‘ %dst_f,‘r‘,encoding=‘utf-8‘) as f_old: # data = f_old.read() # data = data.replace(msg_old,msg_new) # with open(r‘%s‘ %dst_f,‘w‘,encoding=‘utf-8‘) as f_new: # f_new.write(data) # 方法二: dst_f_swap = input(‘臨時交換的文件名>>‘) with open(r‘%s‘ %dst_f,‘r‘,encoding=‘utf-8‘) as f_old, open(r‘%s‘ % dst_f_swap,‘w‘,encoding=‘utf-8‘) as f_new: for line in f_old: if msg_old in line: line = line.replace(msg_old,msg_new) f_new.write(line) os.remove(dst_f) os.rename(dst_f_swap,dst_f) elif choice == ‘quit‘: break else: print(‘沒有這個選項,請重新輸入...‘)View Code
補充說明:資源回收
打開一個文件包含兩部分資源:操作系統級打開的文件+應用程序的變量。在操作完畢一個文件時,必須把與該文件的這兩部分資源一個不落地回收 回收方法為: 1)f.close() #回收操作系統級打開的文件 2)del f #回收應用程序級的變量 其中del f一定要發生在f.close()之後,否則就會導致操作系統打開的文件還沒有關閉,白白占用資源,而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢文件後,一定要記住f.close() 推薦傻瓜式操作方式:使用with關鍵字來幫我們管理上下文 with open(‘a.txt‘,‘w‘) as f: pass with open(r‘test.txt‘,‘r‘,encoding=‘utf-8‘) as f: data=f.read()
Python全棧-day6-day7