文件操作
1.數(shù)據(jù)持久化(數(shù)據(jù)本地化)
計(jì)算機(jī)內(nèi)存分為硬盤和運(yùn)行內(nèi)存友鼻。當(dāng)運(yùn)行程序的時(shí)候系統(tǒng)會(huì)自動(dòng)在裕興內(nèi)存中開辟空間保存程序隱形過程中
產(chǎn)生的數(shù)據(jù)酗昼;但是當(dāng)程序運(yùn)行的結(jié)束的時(shí)候廊谓,這個(gè)內(nèi)存空間會(huì)自動(dòng)銷毀,所以數(shù)據(jù)也會(huì)銷毀麻削。
如果希望數(shù)據(jù)一直存在蒸痹,需要將數(shù)據(jù)儲(chǔ)存在硬盤中舔示。
存儲(chǔ)到本地文件的數(shù)據(jù),就是存儲(chǔ)在硬盤中的數(shù)據(jù)电抚,就能持久化
txt文件、二進(jìn)制文件(圖片竖共、視頻蝙叛、音頻、壓縮文件)公给、json文件借帘、plist文件、數(shù)據(jù)庫文件(.db,.sql
2.文件操作 - 文件內(nèi)容的操作
基本步驟:打開文件 - 讀/寫 - 關(guān)閉
1)打開文件
open(file,model = 'r', encoding = None) - 打開指定文件淌铐,返回文件對(duì)象
file - 字符串肺然,需要打開的文件的路徑,可以是絕對(duì)路徑腿准,也可以是相對(duì)路徑
絕對(duì)路徑:文件在電腦中的全路徑(一般很少使用)
相對(duì)路徑:./斜桿(當(dāng)前目錄-當(dāng)前py文件所在的目錄)际起,可以省略
../(當(dāng)前目錄的上層目錄)
.../(當(dāng)前目錄的上層目錄的上層目錄)
model - 字符串,文件打開方式吐葱;打開方式?jīng)Q定了打開文件后支持的操作和操作的數(shù)據(jù)類型
'r':默認(rèn)值街望,只讀;讀出來的數(shù)據(jù)是字符串類型
'w':只寫弟跑;只能將字符串寫入文件灾前;(先刪除原文件的內(nèi)容再寫)
'rb'/'br':只讀;讀出來的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)(bytes)
'wb'/'bw': 只寫孟辑;只能將二進(jìn)制數(shù)據(jù)寫入文件(先刪除原文件的內(nèi)容再寫)
'a':只寫哎甲;只能將字符串寫入文件;(保留原文件內(nèi)容追加)
'ab'/'ba':只寫饲嗽,將二進(jìn)制寫入文件(保留原文件寫入)
encoding - 設(shè)置文件內(nèi)容的編碼方式炭玫。固定寫:'utf-8';只針對(duì)文本文件有效
注意:只有文本操作才能設(shè)置編碼方式
文本文件在讀和寫的時(shí)候的編碼和解碼的方式必須一致
2)操作文件
a.讀操作 - 獲取文件中的內(nèi)容貌虾,
文件對(duì)象.read() - 會(huì)返回文件中的內(nèi)容
文件對(duì)象.readline() - 讀一行內(nèi)容(從讀寫位置讀到一行結(jié)尾)
3)關(guān)閉文件
文件對(duì)象.close()
f = open('./file/text.txt', 'r', encoding='utf-8')
content = f.read()
print(type(content))
print(content)
f.seek(0)
print(f.readline())
while True:
content = f.readline()
if not content:
break
print(content)
移動(dòng)讀寫位置(移動(dòng)光標(biāo))
文件對(duì)象.seek(0) - 將讀寫位置移到文件開頭
f.seek(0)
f.close()
寫操作:文件對(duì)象.write(寫的內(nèi)容) - 將指定的內(nèi)容寫入文件中
f = open('file/text.txt', 'w', encoding='utf-8')
f.write('abc')
f.close()
練習(xí)
數(shù)據(jù)持久化:a.需要數(shù)據(jù)的時(shí)候去文件讀數(shù)據(jù) b.數(shù)據(jù)發(fā)生改變后將最新的數(shù)據(jù)寫入文件中
統(tǒng)計(jì)當(dāng)前程序運(yùn)行的次數(shù)
f = open('file/count.txt', 'r', encoding='utf-8')
num = int(f.read())
f.close
num += 1
print(num)
# 每次寫入清空文件中的內(nèi)容
f = open('file/count.txt', 'w', encoding='utf-8')
f.write(str(num))
f.close()
練習(xí):寫一
個(gè)程序打印賬號(hào)和余額
存錢和取錢
value = int(input('1.存錢 2.取錢:'))
if value == 1:
in_money = int(input('金額:'))
f = open('file/count1.txt', 'r', encoding='utf-8')
num = int(f.read())
f.close
in_money += num
print(in_money)
f = open('file/count1.txt', 'w', encoding='utf-8')
f.write(str(in_money))
f.close()
二進(jìn)制文件
1.常見的二進(jìn)制文件:圖片文件础嫡、視頻文件、音頻文件酝惧、壓縮文件等
不是只有二進(jìn)制文件才支持'b'操作(rb,wb,ab)榴鼎,但是二進(jìn)制文件只能采用'b‘操作
注意:所有帶'b'的操作不能設(shè)置encoding
f = open('file/text.txt', 'rb')
content = f.read()
print(type(content))
f.close()
f = open('file/字符串.png', 'rb')
content = f.read()
print(content)
f.close()
f = open('file/new.jpg', 'wb')
f.write(content)
f.close()
下載圖片實(shí)例
import requests
response = requests.get('https://www.baidu.com/img/bd_logo1.png?where=super')
f = open('file/baidu.png', 'wb')
f.write(response.content)
f.close()
2.文件不存在
如果以讀的方式打開一個(gè)不存在的文件,程序會(huì)報(bào)錯(cuò)
如果以寫的方式打開一個(gè)不存在的文件晚唇,不會(huì)報(bào)錯(cuò)巫财,并且會(huì)自動(dòng)創(chuàng)建這個(gè)文件
3.打開文件的簡(jiǎn)寫
1)語法:
with open(文件路徑,讀寫方法哩陕, encoding=b編碼方式) as 文件對(duì)象:
文件域(操作文件)
2)說明:
以這種方式打開文件平项,在文件域結(jié)束后赫舒,文件會(huì)自動(dòng)關(guān)閉
json數(shù)據(jù)
1.什么是json數(shù)據(jù) - 滿足json格式的數(shù)據(jù)
json格式:a.一個(gè)json有且只能有一個(gè)數(shù)據(jù) b.這個(gè)數(shù)據(jù)必須是json支持的數(shù)據(jù)類型對(duì)應(yīng)的數(shù)據(jù)
2)json支持的數(shù)據(jù)類型
a.數(shù)字類型 - 所有的數(shù)字,100闽瓢, 0.23
b.字符串 - 使用雙引號(hào)引起來的字符集接癌,支持轉(zhuǎn)義字符和編碼字符例如:"\u4e00qaz", "123"
c.布爾 - 只有true 和false
d.數(shù)組 - 相當(dāng)于python中的列表,例如:["abc", 100, true, [12,45]]
e.字典 - 相當(dāng)于python中的字典扣讼,key只能是字符串缺猛,例如{"q": 100, "c": [12, 34}}
f. null - 相當(dāng)于python中的None,表示空
2.將json轉(zhuǎn)python
json python
數(shù)字類型 int or float
字符串 字符串,雙引號(hào)可能會(huì)變單引號(hào)
布爾 bool,true -> True, false -> False
數(shù)組 list,["abc", true] -> ['abc', True]
null None
2)方法
loads(字符串) - 將json格式的字符串轉(zhuǎn)換成對(duì)應(yīng)的python數(shù)據(jù)
注意:字符串的內(nèi)容必須是json格式的數(shù)據(jù)
result = json.loads('123')
print(result)
result = json.loads('"abc"')
print(result)
result = json.loads('[123, "abc", false, null]')
print(result)
3.將python轉(zhuǎn)json
1)轉(zhuǎn)換關(guān)系
python json
int/float 數(shù)字
str 字符串椭符,單引號(hào)會(huì)變雙引號(hào)
bool 布爾荔燎,True ->true,False -> false
list/tuple 數(shù)組
dict 字典
None null
2)方法
dumps(數(shù)據(jù)) - 將數(shù)據(jù)格式轉(zhuǎn)換成json格式的字符串
result = json.dumps('abc')
print(type(result), result)
result = json.dumps([10, True, 'abc', [None, 100]])
print(type(result), result)
students = {'name': 'xianmong', 'age': 17}
result = json.dumps(students)
print(type(result),result)