1.數(shù)據(jù)持久化(數(shù)據(jù)本地化)
保存在程序中的數(shù)據(jù)是保存在運行內(nèi)存中的,當程序運行結(jié)束,內(nèi)存會自動釋放,數(shù)據(jù)也會消失;
如果不希望數(shù)據(jù)隨著程序的結(jié)束而消失,就小江數(shù)據(jù)通過文件存儲到硬盤里面
-
程序中經(jīng)常用來保存數(shù)據(jù)的文件有:數(shù)據(jù)庫文件(.db .sqlite);json文件(文本文件的一種格式);
- plist文件;txt文件
- png文件/jpg文件/gif文件...mp3文件/mov文件等/mp3等
2.文件操作(操作文件中的內(nèi)容)
1)步驟:
打開文件 -> 操作文件內(nèi)容(讀操作/寫操作) -> 關(guān)閉文件
打開文件: open(file,mode = 'r',encoding=None) - 以指定的方式打開指定文件并且返回文件對象
說明:
file - 字符串;文件在電腦中的地址(文件路徑)
路徑可以寫絕對路徑,也可以寫相對路徑
絕對路徑 - 文件在電腦中完整的路徑(r'絕對路徑')
相對路徑 - 文件在工程目錄下的路徑,('./文件名')/('文件名')
./代表當前目錄
../代表當前目錄的上層目錄
.../代表當前目錄的上層目錄的上層目錄
注意:當前目錄值得是當前py文件所在的目錄
mode - 字符串;文件的打開方式,決定打開文件后能夠?qū)ξ募鍪裁匆约白x寫的數(shù)據(jù)類型
'r'/'rt'/'tr' - 以只讀的方式打開文件;讀出來的內(nèi)容是字符串
'rb'/'br' - 以只讀的方式打開文件;讀出來的內(nèi)容四二進制數(shù)據(jù)(bytes)
'w'/'wt'/'tw' - 以只寫的方式打開文件;將字符串寫入文件(覆蓋的方式)(打開就直接清空原內(nèi)容)
'wb'/'bw' - 以只寫的方式打開文件;將二進制寫入文件(覆蓋的方式)
'a'/'at'/'ta' - 以只寫的方式打開文件;以字符串寫入文件(追加的方式)
'ab'/'ba' - 以只寫的方式打開文件;將二進制寫入文件(追加的方式)encoding - 字符串:設(shè)置文本文件的編碼方式(只針對文本文件有效); 一般使用'utf-8'
注意:
1.同一個文件,讀和寫的編碼方式必須一樣
2.值針對文本文件的文本操作有效,所有帶b的操作都不能設(shè)置encoding
關(guān)閉文件:
文件對象.close()
3.讀寫操作
"""
1) 讀操作
文件對象.read() - 獲取整個文件中所有的內(nèi)容,以字符串或者二進制的形式返回
文件對象.readline() - 獲取文本文件中一行的內(nèi)容,以字符串或者二進制的形式返回
注意:讀操作中讀的位置是從光標開始,換行讀會讓光標下移
f.seek(0) - 移動光標到開頭
2) 寫操作
對象.write(內(nèi)容) - 將內(nèi)容寫入到指定的文件中
1.with - open
打開文件,在文件作用域中對文件進行操作,離開文件作用域文件自動關(guān)閉
語法:
with open(file,mode='r',encoding=None) as 文件對象:
文件作用域(操作文件)
with open('./file/testfile1','a',encoding='utf-8') as f:
print(f.write('我要做宰相\n'))
2.打開不存在的文件
以讀的方式打開不存在的文件:程序會出現(xiàn)filenotfounderror異常
以寫的方式打開不存在的文件:不會出現(xiàn)異常,并且會創(chuàng)建一個空的文件
3.二進制文件的讀寫
1)普通文本文件:可以適用帶t或者帶d的讀寫方式去打開
2)二進制數(shù)據(jù)文件:視頻文件/音頻文件/圖片文件都是二進制文件,這些文件只能用帶b的打開方式去打開
數(shù)據(jù)的持久化
1.怎么做到數(shù)據(jù)的持久化
"""
a.將數(shù)據(jù)保存到本地文件
b.需要這個數(shù)據(jù)的時候不是直接賦值,而是從本地文件中去取值
c.當數(shù)據(jù)的值發(fā)生改變后,將最新的數(shù)據(jù)更新到文件中
1.統(tǒng)計當前程序運行的次數(shù)
# num=1
# print(num)
# num += 1
with open('file/testfile2.txt','r',encoding='utf-8') as f:
num = int(f.read())
num += 1
print('第%d次運行程序'%num)
with open('file/testfile2.txt', 'w', encoding='utf-8') as f:
f.write(str(num))
eval:去掉字符串的引號,將其轉(zhuǎn)換為其它序列(去掉引號里面是什么就轉(zhuǎn)換成什么)
str1 = "{'a':1,'b':2}"
dict1 = eval(str1)
str2 = "[1,2,3,4,5]"
list1 = eval(str2)
練習:注冊賬號,并且打印當前以及注冊過的賬號
with open('file/user_pw','r',encoding='utf-8') as f:
users = eval(f.read())
while True:
user_name = input('用戶名:')
pw = input('密碼:')
users[user_name] = pw
value = input('是否繼續(xù)(y/n):')
if value == 'n':
break
print(users)
with open('file/user_pw','w',encoding='utf-8') as f:
f.write(str(users))
json數(shù)據(jù)
1.什么是json數(shù)據(jù)
json是一種通用的數(shù)據(jù)格式:幾乎所有的高級語言都支持將json數(shù)據(jù)轉(zhuǎn)換成當前語言數(shù)據(jù),也支持將當前語言數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù)
一般數(shù)據(jù)接口提供的數(shù)據(jù)都是json格式的數(shù)據(jù)
2.json格式
json格式:a.一個json有且只能有一個數(shù)據(jù) b.這個數(shù)據(jù)必須是json支持的數(shù)據(jù)類型的數(shù)據(jù)
json支持的數(shù)據(jù)類型:
數(shù)字類型 - 包括所有的數(shù)字.例如:100、 -23、 23.4、 3e4
字符串 - 用雙引號引起來的字符集,例如:"aad"、 "123"、 "asd123"、 "asd\n334"、 "\u4e00"
布爾值 - 只有true和false兩個值(小寫)
數(shù)組 - 相當于python中的列表:[123,"你好",true,[1,2,3]]
字典 - 相當于python中的字典;key必須是json的字符串:{"a":1,"b":2}
空值 - null:相當于python中的None,表示空和沒有
3.將json數(shù)據(jù)轉(zhuǎn)換成python數(shù)據(jù)
a.對應(yīng)關(guān)系
json python
數(shù)字類型 int/float
字符串 str,雙引號可能會變成單引號
布爾值 bool,true -> True, false -> False
數(shù)組 list
字典 dict
空值 null -> None
b.轉(zhuǎn)換方法
json模塊中有一個loads可以將json格式的數(shù)據(jù)轉(zhuǎn)換成python對應(yīng)的數(shù)據(jù)
loads(字符串) - 將json格式的字符串轉(zhuǎn)換成python數(shù)據(jù)
注意: 這兒的字符串的內(nèi)容必須是json數(shù)據(jù)
json模塊是python內(nèi)置的模塊:模塊主要提供和json操作相關(guān)的函數(shù)
import json
print(type(json.loads('"123"')),json.loads('"123"')) # <class 'str'> 123
print(type(json.loads('123')),json.loads('123')) # <class 'int'> 123
print(type(json.loads('[1,2,3,true]')),json.loads('[1,2,3,true]')) # <class 'list'> [1, 2, 3, True]
print(type(json.loads('{"a":1,"b":null}')),json.loads('{"a":1,"b":null}')) # <class 'dict'> {'a': 1, 'b': None}
4.將python數(shù)據(jù)轉(zhuǎn)換成json
1) 轉(zhuǎn)換關(guān)系
python -> json
int、float -> 數(shù)字
str -> 字符串(單引號會變成雙引號
bool -> 布爾 True -> true False -> false
list/tuple -> 數(shù)組
dict -> 字典
None -> null
注意:其它類型需要先轉(zhuǎn)換成以上python類型,再轉(zhuǎn)換
2)轉(zhuǎn)換方法
dumps(數(shù)據(jù)) -> 不管數(shù)據(jù)是什么,dumps都會將括號中的數(shù)據(jù)轉(zhuǎn)換為json格式的字符串
print(type(json.dumps([1,2,3,4])), json.dumps([1,2,3,4])) # <class 'str'> [1, 2, 3, 4]