文件操作和異常處理
一.文件操作1
1.數(shù)據持久化(數(shù)字本地化)
保存在程序中的數(shù)據是保存在運行內存中的候址,當程序運行結束咙俩,內存會自動釋放型奥,數(shù)據也會消失琐旁。
如果不希望數(shù)據隨著數(shù)據隨著程序的結束而消失误窖,就需要將數(shù)據通過文件存儲到硬盤里叮盘。
程序中經常用來保存數(shù)據的文件有:
數(shù)據庫文件(db, sqlite);json文件;plist文件霹俺;txt文件等
png文件柔吼、jpg文件、gif文件...mp4文件丙唧、mov文件等等
2.文件操作(操作文件中的內容)
1)步驟:打開文件 -> 操作文件內容(讀操作愈魏、寫操作) -> 關閉文件
a.打開文件:
open(file, mode = 'r', encoding=None) ?-? 以指定的方式打開文件,并返回執(zhí)行對象
說明:
file ?-? 字符串;文件在電腦中的地址(文件路徑)
路徑可以寫絕對路徑也可以寫相對路徑
絕對路徑:文件在電腦中的完整路徑(路徑前加r防止\轉義)
相對路徑:./代表當前路徑
../ 代表當前目錄的上層目錄
.../代表當前目錄的上層目錄的上層目錄
注意:當前目錄指的是當前文件所在的目錄
絕對路徑
open(r'D:\Python_1904_Nor\語言基礎\day12-文件操作和異常處理\test.txt')
相對路徑
open('./test.txt')
open('test.txt') ?? # 一個 ./ 可以省略
mode ?-? 字符串想际;文件的打開方式培漏,決定打開文件后能夠對文件做什么以及讀寫的數(shù)據類型。
'r'/'rt'?-? 以只讀的方式打開文件;讀出來的內容是字符串
'rb'/'br' ?-? 以只讀的方式打開文件;讀出來的內容是二進制數(shù)據
'w'/'wt'/'tw' ?-? 以只寫的方式打開文件;將字符串寫入文件;會清空原文件
'wb'/'bw' ?-? 以只寫的方式打開文件;將二進制寫入文件
'a'/'at'/'ta' ?-? 以只寫的方式打開文件;將字符串寫入文件;不會清空原文件,追加
'ab'/'ba' ?-? 以只寫的方式打開文件;將二進制寫入文件;不會清空原文件,追加
encoding?-? 字符串;設置文本文件的編碼方式(只針對文本文件有效)
注意:1.同一個文件胡本,讀和寫的編碼方式必須一樣
2.只針對文本文件的文本操作有效,所有帶'b'的方式都不能設置encoding
打開文件
f = open('test.txt', 'r', encoding='utf-8')
3.讀寫操作
1)讀操作
文件對象.read() - 獲取整個文件的內容,以字符串或者二進制的形式返回
文件對象.readline() - 獲取文本文件中一行的內容牌柄,以字符串或者二進制的形式返回
f = open('test.txt','r',encoding='utf-8')
content = f.read()
print(content)
f.seek(0) # 移動光標到文件開頭
content = f.readline()
print(content)
f.close()
2)寫操作
f = open('test.txt','w',encoding='utf-8')
f.write('abc')
b.關閉文件
文件對象.close()
二.文件操作2
1.with - open
打開文件,在文件作用域中對文件進行操作侧甫。離開文件作用域文件自動關閉
語法:
with open(file, mode='r', encoding=None) as 文件對象:
文件作用域(操作文件)
with open('./files/test3.txt','r',encoding='utf-8') as f:
while True:
line = f.readline()
if not line:
break
print(line)
2.打開不存在的文件
以讀的方式打開不存在的文件:程序會報錯
以寫的方式打開不存在的文件友鼻,不會出現(xiàn)異常傻昙,并且會創(chuàng)建一個空的文件
open('files/test5.txt','wb')
3.二進制文件的讀寫
1)普通文本文件:可以使用帶t或者帶d的讀寫方式去打開
2)二進制數(shù)據文件:視頻文件、音頻文件彩扔、圖片都是二進制文件,這些文件只能用帶b的打開方式去打開
with open('files/TIM.png','rb') as f:
content = f.read()
print(content)
with open('files/new_TIM.png','wb') as f:
f.write(content)
三.文件操作引用
1.怎么做到數(shù)據的持久化
a.將數(shù)據保存到本地文件
b.需要數(shù)據的時候不是直接賦值而是從本地文件中去取值
c.當數(shù)據值發(fā)生改變后僻爽,將最新的數(shù)據更新到文件中
#練習:統(tǒng)計當前程序運行的次數(shù)
with open('files/data.txt','r',encoding='utf-8') as f:
num = int(f.read())
print('第{}次運行程序'.format(num))
with open('files/data.txt','w',encoding='utf-8') as f:
f.write(str(num+1))
2.eval的使用
將序列字符串轉換成序列
str1 = '{}'
dict1 = eval(str1)
print(type(dict1))
四.json數(shù)據
import json
json模塊是python內置的模塊虫碉,模塊主要提供和json操作相關的函數(shù)
1.什么是json數(shù)據
json是一種通用的數(shù)據格式;幾乎所有的高級語言都支持將json數(shù)據轉換為當前語言數(shù)據胸梆,也支持將當前語言數(shù)據轉換為json數(shù)據
一般數(shù)據接口提供的數(shù)據都是json格式的數(shù)據
2.json格式
json格式: a. 一個json有且只能有一個數(shù)據
b.這個數(shù)據必須是json支持的數(shù)據類型的數(shù)據
json支持的數(shù)據類型:
數(shù)字類型:包括所有的數(shù)字敦捧,例如:100,12.5,-34碰镜,-2.13兢卵,3e3(支持科學技術法)
字符串:用雙引號引起來的字符集,例如绪颖,"abc","123","abc\n",'\u4e00'(雙引號)
布爾值:只有true和false兩個值(小寫)
數(shù)組:相當于python中的列表秽荤,列表中應該是json支持的數(shù)據類型
字典:相當于pyhton中的字典,key必須是字符串柠横,值可以為任意數(shù),例如{"b":1}
空值:null窃款;相當于python中的None,表示空和沒有
3.將json數(shù)據抓換成python數(shù)據
a.對應關系
json? ? ?? python
數(shù)字類型? ? int/float
字符串 ? ? str,雙引號可能會變成單引號
布爾值 ? ? bool牍氛,true -> True ; false -> False
數(shù)組 ? ? ? ? list
字典 ? ? ? ? dict
空值 ? ? ? ? null -> None
b.轉換方法
json模塊中有一個loads可以將json格式的數(shù)據轉換成python對應的數(shù)據
loads(字符串) - 將json格式的字符串轉換成python數(shù)據
注意:這兒字符串的內容必須是json數(shù)據
4.將python數(shù)據轉換成json
1)轉換關系
python ? ? ? ? json
int/float ? ? ? ? 數(shù)字
str ? ? 字符串晨继,引號都會變成雙引號
bool ? ? 布爾,True -> true ; False -> false
list搬俊、tuple ? ? ? 數(shù)組
dict ? ? ? ? ? 字典
None ? ? ? ? ? null
2)轉換方法
dumps(數(shù)據) ? - ? 將括號中的python數(shù)據轉換成json格式的字符串