python學習(11)文件的讀寫操作

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()

運行結果: