python學習(11)文件的讀寫操作
- 2020 年 5 月 13 日
- 筆記
- json, Python, requests模塊調用API, 讀寫文件
1.讀文件的7種操作模式
操作模式 | 具體含義 |
---|---|
'r' |
讀取 (默認) |
'w' |
寫入(會先截斷之前的內容) |
'x' |
寫入,如果文件已經存在會產生異常 |
'a' |
追加,將內容寫入到已有文件的末尾 |
'b' |
二進制模式 |
't' |
文本模式(默認) |
'+' |
更新(既可以讀又可以寫) |
2.讀取文本文件時,需要在使用open
函數時指定好帶路徑的文件名(可以使用相對路徑或絕對路徑)並將文件模式設置為'r'
(如果不指定,默認值也是'r'
),然後通過encoding
參數指定編碼(如果不指定,默認值是None,那麼在讀取文件時使用的是操作系統默認的編碼),如果不能保證保存文件時使用的編碼方式與encoding參數指定的編碼方式是一致的,那麼就可能因無法解碼字符而導致讀取失敗。
def main(): f = open('123.txt','r',encoding='utf-8') print(f.read()) f.close() if __name__ == '__main__': main()
3.防止讀寫異常
將那些在運行時可能會出現狀況的代碼放在try
代碼塊中,在try
代碼塊的後面可以跟上一個或多個except
來捕獲可能出現的異常狀況。例如在上面讀取文件的過程中,文件找不到會引發FileNotFoundError
,指定了未知的編碼會引發LookupError
,而如果讀取文件時無法按指定方式解碼會引發UnicodeDecodeError
,我們在try
後面跟上了三個except
分別處理這三種不同的異常狀況。最後我們使用finally
代碼塊來關閉打開的文件。
def main(): f = None try: f = open('123.txt','r',encoding='utf-8') print(f.read()) except FileNotFoundError: print('無法打開指定的文件!') except LookupError: print('指定了未知的編碼!') except UnicodeDecodeError: print('讀取文件時解碼錯誤!') finally: if f: f.close() if __name__ == '__main__': main()
4.讀取文件的方式
有三種:一次性讀取完成;使用for-in按行讀取;使用readlines()按行讀取到列表中;
使用with open()函數的時候可以不用f.open()函數,因為with open提供了一種自動關閉文件的功能。
import time def main(): # 一次性讀取整個文件內容 with open('123.txt',mode='r',encoding='utf-8') as f: print(f.read()) # 通過for-in循環按行讀取 with open('123.txt',mode='r',encoding='utf-8') as f: for line in f: print(line,end='') time.sleep(1) print() # 讀取文件按行讀取到列表中 with open('123.txt',mode='r',encoding='utf-8') as f: lines = f.readlines() print(lines) # with open提供了一種自動關閉文件的功能 if __name__ == '__main__': main()
5.將文本信息寫入文件文件,在使用open
函數時指定好文件名並將文件模式設置為『w'
即可。注意如果需要對文件內容進行追加式寫入,應該將模式設置為'a'
。如果要寫入的文件不存在會自動創建文件而不是引發異常。下面的例子演示了如何將1-9999之間的素數分別寫入三個文件中(1-99之間的素數保存在a.txt中,100-999之間的素數保存在b.txt中,1000-9999之間的素數保存在c.txt中)。
from math import sqrt def is_prime(n): """判斷素數的函數""" assert n > 0 for factor in range(2,int(sqrt(n))+1): if n % factor == 0: return False return True if n != 1 else False def main(): filenames = ('a.txt','b.txt','c.txt') fs_list = [] try: for filename in filenames: fs_list.append(open(filename,'w',encoding='utf-8')) for number in range(1,10000): if is_prime(number): if number < 100: fs_list[0].write(str(number)+'\n') elif number < 1000: fs_list[1].write(str(number)+'\n') elif number <10000: fs_list[2].write(str(number)+'\n') except IOError as ex: print(ex) print('寫文件時發生錯誤!') finally: for fs in fs_list: fs.close() print('操作完成!') if __name__ == '__main__': main()
6.讀寫二進制文件
示例是一個讀圖片文件寫為一個新的圖片文件
def main(): # 讀一個圖片文件並寫一個圖片文件 try: with open('123.jpg','rb') as fs1: data = fs1.read() print(type(data)) with open('456.jpg','wb') as fs2: fs2.write(data) except FileNotFoundError as e: print('指定的文件無法打開!') except IOError as e: print('讀寫文件時出現錯誤!') if __name__ == '__main__': main()
7.關於JSON的讀寫
json模塊主要有四個比較重要的函數,分別是:
dump
– 將Python對象按照JSON格式序列化到文件中dumps
– 將Python對象處理成JSON格式的字符串load
– 將文件中的JSON數據反序列化成對象loads
– 將字符串的內容反序列化成Python對象
序列化(serialization)在計算機科學的數據處理中,是指將數據結構或對象狀態轉換為可以存儲或傳輸的形式,這樣在需要的時候能夠恢復到原先的狀態,而且通過序列化的數據重新獲取位元組時,可以利用這些位元組來產生原始對象的副本(拷貝)。與這個過程相反的動作,即從一系列位元組中提取數據結構的操作,就是反序列化(deserialization)」。
8.寫一個json文件
import json def main(): mydict = { 'name': '馬文飛', 'age': 20, 'qq': 1154196461, 'friends': ['翟華兵', '魏家劍','丁文傑','蘇藝','秦旭壯'], 'cars': [ {'brand': 'BYD', 'max_speed': 180}, {'brand': 'Audi', 'max_speed': 280}, {'brand': 'Benz', 'max_speed': 320} ] } try: with open('data.json','w',encoding='utf-8') as fs: json.dump(mydict,fs) except IOError as e: print(e) print('保存數據完成!') if __name__ == '__main__': main()
9.讀json文件
import json def main(): try: with open('data.json','r',encoding='utf-8') as fs: temp = json.loads(fs.read()) print(temp) except IOError as e: print(e) if __name__ == '__main__': main()
10.requests模塊請求json數據
首先你要申請API
天行數據網址://www.tianapi.com/
代碼中我自己申請的開封空氣質量和開封天氣的API,測試很好用,要是報錯的話,需要自己申請API網址已給出。
import requests import json def main(): # # 申請了一個查看空氣質量的API 天行數據網址://www.tianapi.com/ resp = requests.get('//api.tianapi.com/txapi/aqi/index?key=bcbdd890ed0b7fd449d6de8ebb71d8e0&area=開封') data_model = json.loads(resp.text) print(data_model['newslist']) # 申請了一個查看空氣質量的API resp = requests.get('//api.tianapi.com/txapi/tianqi/index?key=bcbdd890ed0b7fd449d6de8ebb71d8e0&city=開封') data_model = json.loads(resp.text) print(data_model['newslist']) if __name__ == '__main__': main()
運行結果: