一堰乔、文件操作
文件 (保存數(shù)據(jù)--永久的)
文件都有后綴仓犬,不同的后綴表示不同的存儲(chǔ)方式
文本文件(存文字信息)
二進(jìn)制文件:視頻文件、音頻超棺、圖片
可執(zhí)行文件等
文本文件向族、二進(jìn)制文件、json文件(重點(diǎn))的操作
1.文件操作(對(duì)文件進(jìn)行讀寫)
步驟(所有的文件操作都滿足這三步):
1.打開文件
2.對(duì)文件進(jìn)行讀/寫操作(讀:獲取文件內(nèi)容; 寫:修改文件內(nèi)容)
3.關(guān)閉文件
python中的文件操作:
1.文本文件:open(文件路徑,打開的模式,encoding(編碼方式))
open函數(shù)有一個(gè)返回值:返回的就是被打開的文件句柄對(duì)象
文件句柄:就是文件的代言人棠绘,對(duì)文件句柄對(duì)象進(jìn)行操作
文件路徑:文件在電腦中對(duì)應(yīng)的地址
1.直接寫全路徑(不推薦使用)
2.一般將文件放到工程中
a.文件和代碼對(duì)應(yīng)的.py文件在同一個(gè)目錄下:路徑直接寫文件名
b.在工程文件夾下件相,但是不直接和代碼文件在一個(gè)目錄里面:./放文件的文件夾名/文件名
打開模式:
'r'-->讀(以讀的形式打開再扭,只能獲取內(nèi)容,不能修改內(nèi)容)
'w'-->文本寫(以寫的形式打開夜矗, 只能修改文件泛范,不能獲取文件內(nèi)容)
'a'-->文本寫
'br'-->二進(jìn)制讀
'bw'-->二進(jìn)制寫
'ba'-->二進(jìn)制寫
2文本文件
a.打開文件
f就是被打開的文件對(duì)應(yīng)的文件句柄
utf-8:一種文本編碼方式,是使用 1-6個(gè)字節(jié)對(duì)Unicode進(jìn)行編碼紊撕;
utf-8就可以編碼所有國家語言對(duì)應(yīng)的字符的文本
gbk:只支持中文文本編碼
f = open('yy_shlie.txt', 'r', encoding='utf-8')
b.讀操作
注意:對(duì)同一文件句柄對(duì)象進(jìn)行操作罢荡,每讀一次內(nèi)容,下次在讀的時(shí)候逛揩,從上次讀的結(jié)束的位置往下讀
read():獲取文件中所有內(nèi)容柠傍,并且返回
文本文件讀取的結(jié)果是字符串
# result = f.read()
# print(result) # print('hahha') print('哈哈')
read(n):n-->指定讀取的文本長度(-1:讀取全部內(nèi)容麸俘,n大于長度:讀取所有內(nèi)容)
result = f.read(10)
print(result) # print('hah
readline():每次讀一行內(nèi)容
result = f.readline()
result = f.readline()
print(result) # print('哈哈')
f.readlines():將文件中所有的內(nèi)容讀出來辩稽,將每一行的內(nèi)容作為列表的元素返回的
result = f.readlines()
print(result)
練習(xí):1.讀取指定文件的所有內(nèi)容 2.讀取指定文件的所有內(nèi)容(一行一行的讀)
1.result = f.read(-1)
print(result)
2.while True:
result = f.readline()
if result == '':
break
# if not result:
# break
# if len(result) == 0:
# break
print(result)
二、修改讀取的位置
讀寫文件从媚,每次讀完或者寫完逞泄,下次再讀寫的時(shí)候,是接著上次讀寫的位置往下進(jìn)行讀寫
避免這個(gè)問題的方法:1.重新打開文件拜效,然后再讀喷众;2.設(shè)置讀寫位置
f = open('yy_shlie.txt', 'r', encoding='utf-8')
讀取文件中所有的內(nèi)容,下次在讀就是從文件結(jié)束的位置往后讀
print(f.read())
seek(偏移量):是字節(jié)數(shù)(一個(gè)字母是一個(gè)字節(jié)紧憾,一個(gè)中文漢字是兩個(gè)字節(jié))
設(shè)置讀寫位置為文件的開始:后邊進(jìn)行讀操作的時(shí)候到千,就是從文件開始的位置往后讀
注意:這個(gè) 偏移量一般設(shè)置為0,其他值容易出差錯(cuò)
f.seek(0)
print(f.read())
三赴穗、文本文件的寫操作(修改文件內(nèi)容)
1.打開文件
2.寫操作
3.關(guān)閉
f = open('yy_shlie.txt', 'w', encoding='utf-8')
write(寫的內(nèi)容):文本文件中寫的內(nèi)容時(shí)字符串
注意:'w'-->寫的時(shí)候會(huì)覆蓋原文件的內(nèi)容 'a'-->在原文件的內(nèi)容的后面去追加內(nèi)容
f.write('添加內(nèi)容')
f.seek(0) # 后面寫的時(shí)候憔四,會(huì)覆蓋前面寫的內(nèi)容的形式去寫
f.writelines(['aaa', 'bbb'])
f.close()
四、文本文件的掌握點(diǎn)
1.文件操作的步驟:
1.打開文件
2.操作
3.關(guān)閉
2.python中打開文件
open()函數(shù):
open(文件路徑, 打開方式, 編碼方式)
文件路徑:絕對(duì)地址般眉、相對(duì)地址
打開方式:
'r'--->讀(默認(rèn))
'w'--->寫(1.覆蓋原文件內(nèi)容)
'a'--->寫(在原文件內(nèi)容后面追加)
文本文件的內(nèi)容了赵,對(duì)應(yīng)的是字符串
讀操作:注意:如果文件的路徑寫錯(cuò)了會(huì)報(bào)錯(cuò):FileNotFoundError
寫操作:注意:'w'、'a'打開文件甸赃,如果這個(gè)文件不存在柿汛,會(huì)創(chuàng)建一個(gè)新的文件
在python中國可以使用以下結(jié)構(gòu)來進(jìn)行文件操作過程:
with open() as 文件變量
---- 在文件打開后關(guān)閉前執(zhí)行的代碼段
with open('yy_shlie.txt', 'r', encoding='utf-8') as f:
print(f.read())
五、二進(jìn)制文件的操作
二進(jìn)制文件的讀
bytes類:python中的二進(jìn)制數(shù)據(jù)對(duì)應(yīng)的類型是bytes-->data
二進(jìn)制文件的讀'br'
with open('fyh.jpg', 'br') as f:
data = f.read()
print(type(data)) # <class 'bytes'>
print(data)
二進(jìn)制文件的寫'bw'
with open('new.jpg', 'bw') as f:
f.write(data) # data需要是bytes類型的數(shù)據(jù)
二進(jìn)制文件的寫'ba'
with open('new1 .jpg', 'ba') as f:
f.write(data) # data需要是bytes類型的數(shù)據(jù)
六埠对、json文件的讀寫
json文件:就是后綴是.json的文件络断,用來存儲(chǔ)文本數(shù)據(jù)(以特殊的語法結(jié)構(gòu)來存儲(chǔ)文本信息)
最外層要么是字典結(jié)構(gòu),要么是列表結(jié)構(gòu)
里面的數(shù)據(jù):字符串项玛、數(shù)字貌笨、二進(jìn)制、字典稍计、數(shù)組(列表)
格式:
{}-->字典結(jié)構(gòu)
{
"name":"aa",
"age":18,
"score":[100, 90, 80]
}
[]-->數(shù)組(列表)結(jié)構(gòu)
[
100,
"name"
"person":{"name":"張三"}
]
""-->字符串
"
name, abc, njxdd, dfsf
"
json文件的讀寫:
python中使用python內(nèi)置模塊json來對(duì)json數(shù)據(jù)進(jìn)行操作
1.讀取json文件中的內(nèi)容:
json.load(f):讀的結(jié)果只有兩種情況躁绸,要么是字典,要么是列表
json.loads(json字符串, 編碼方式)--->將字典字符串轉(zhuǎn)換成字典;將列表字符串轉(zhuǎn)換成列表
import json
result = json.loads('{"name": "hy", "age": 2}', encoding='utf-8')
print(result, type(result)) # {'name': 'hy', 'age': 2} <class 'dict'>
with open('iKang.json', 'r', encoding='utf-8') as f:
# print(f.read()) 這樣拿出來是字符串
result = json.load(f)
print(type(result)) # <class 'dict'> 字典
print(result)
2.json文件的寫操作
json.dump(寫的內(nèi)容, f):寫的內(nèi)容只能是字典或者列表
json.dumps(對(duì)象)--->將字典净刮、列表轉(zhuǎn)換成字符串剥哑,和loads相反
result = json.dumps([1, 2, 3, 4])
print(result, type(result)) # [1, 2, 3, 4] <class 'str'>
with open('myjson.json', 'w', encoding='utf-8') as f:
dic1 = {'aaa': 100, 'score': 99, 'person': {'name': 'yy', 'age': 23}} # 字典
json.dump(dic1, f)
with open('myjson1.json', 'w', encoding='utf-8') as f:
list1 = [10, 20, 'a', 'abc'] # 列表
json.dump(list1, f)
with open('myjson2.json', 'w', encoding='utf-8') as f:
tuple1 = [10, 26, 'a', 'abc', 920, 'fg'] # 元祖
json.dump(tuple1, f)
七淌哟、學(xué)生信息持久化練習(xí)
寫一個(gè)添加學(xué)生的功能讶凉,將添加的學(xué)生信息持久化
1.添加學(xué)生
2.查看學(xué)生
import json
key_name = 'name'
key_age = 'age'
key_tel = 'tel'
try:
with open('yy_xsxx.json', 'r', encoding='utf-8') as f:
all_students = json.load(f)
except:
all_students = {}
輸入學(xué)生信息
stu_name = input('請(qǐng)輸入學(xué)生姓名:')
stu_age = input('請(qǐng)輸入學(xué)生年齡:')
stu_tel = input('請(qǐng)輸入學(xué)生電話:')
一個(gè)學(xué)生對(duì)應(yīng)一個(gè)字典峻仇,多個(gè)學(xué)生用一個(gè)字典存起來
stu_dict = {
key_name: stu_name,
key_age: stu_age,
key_tel: stu_tel
}
保存學(xué)生信息
all_students[stu_name] = stu_dict
保存到本地
with open('yy_xsxx.json', 'w', encoding='utf-8') as f:
json.dump(all_students, f)
print(all_students)
八库菲、異常捕獲
在之前的學(xué)習(xí)中献宫,由于各種原因找岖,我們的代碼會(huì)出現(xiàn)各種各樣的錯(cuò)誤姐刁,這些錯(cuò)誤叫異常
如果程序出現(xiàn)異常铃诬,程序會(huì)崩潰蘸际,不能繼續(xù)執(zhí)行座哩。
但是有的時(shí)候出現(xiàn)異常,我們可能希望由自己解決出現(xiàn)異常的問題粮彤,不希望程序崩潰根穷,就可以去捕獲異常
捕獲異常:
格式1:
try:
代碼塊1(需要捕獲異常的代碼塊)
except:
代碼塊2(出現(xiàn)異常后執(zhí)行的)
執(zhí)行過程:先執(zhí)行代碼塊1,如果代碼塊1出現(xiàn)異常导坟,就執(zhí)行代碼塊2屿良;
# 如果代碼塊1不出現(xiàn)異常,就執(zhí)行try結(jié)構(gòu)外的其他結(jié)構(gòu)
import json
try:
with open('yy_xsxx1.json', 'r', encoding='utf-8') as f:
all_students = json.load(f)
except:
print('出現(xiàn)異常')
格式2:
try:
代碼塊1
except 錯(cuò)誤類型列表:
代碼塊2
#出現(xiàn)指定錯(cuò)誤類型的異常惫周,才會(huì)捕獲
try:
with open('yy_xsxx2.json', 'r', encoding='utf-8') as f:
all_students = json.load(f)
except FileNotFoundError:
print('出現(xiàn)異常')
except ValueError:
print('值出現(xiàn)異常')
finally:
print('不管有沒有異常都要執(zhí)行')