一、關(guān)于文件
- 文件的作用:把一些數(shù)據(jù)儲(chǔ)存起來
- 使用文件流程:
- 打開文件,讀寫文件,關(guān)閉文件
二、讀寫文件簡(jiǎn)單操作
-
1.讀取文件
#打開文件 file = open("demo1/1.txt",mode="r") #讀取文件 ret = file.read() #file只是變量,read是讀取函數(shù) print(ret) #關(guān)閉文件 file.close() #第一個(gè)參數(shù)的文件的路徑 #第二個(gè)參數(shù)mode=訪問文件的模型,r表示讀,默認(rèn)是r模式 -
2.寫入文件
2.寫文件 write file = open("demo1/1.txt",mode="w") file = open("demo1/111.txt",mode="w") #文件不存在,會(huì)自動(dòng)創(chuàng)建 file = open("demo2/111.txt",mode="w") #不會(huì)創(chuàng)建目錄 file.write("huangzhi") file.close()
三、文件權(quán)限
-
rb 以二進(jìn)制格式打開一個(gè)文件用于只讀。文件指針將會(huì)放在文件的開頭。一般用于 非文本文件如圖片等。
注意:二進(jìn)制文件把內(nèi)容表示為一個(gè)特殊的 bytes 字符串類型。# file = open("demo1/1.txt","rb") file = open("demo1/1.png","rb") ret = file.read() #b'huangzhi' huangzhi print(ret) file.close() -
r+ 打開一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開頭。
file = open("demo1/1.txt","r+") # ret = file.read() #讀取全部?jī)?nèi)容 # print(ret) file.write("guyin") #從頭寫入,原有內(nèi)容會(huì)逐漸被覆蓋 file.close() rb+ 以二進(jìn)制格式打開一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開頭。一般用于 非文本文件如圖片等。
-
wb 以二進(jìn)制格式打開一個(gè)文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。一般用于非文本文件如圖片等。
from demo1.img import img2 file = open("demo1/2.jpg","wb") file.write(img2) file.close() -
w+ 打開一個(gè)文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即 原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。
file = open("demo1/1.txt","w+") file.write("hello world") ret = file.read() print(ret) file.close() -
a 打開一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。
也 就是說,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件 進(jìn)行寫入。#在demo1下的111.txt中追加“guyin” # file = open("demo1/111.txt","a") file = open("demo1/3.txt","a") file.write("guyin") file.close() ab 以二進(jìn)制格式打開一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文 件的結(jié)尾。也就是說,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在, 創(chuàng)建新文件進(jìn)行寫入。
-
a+ 打開一個(gè)文件用于讀寫。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。
文 件打開時(shí)會(huì)是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。file = open("demo1/111.txt","a+") file.write("yangyong") ret = file.read() print(ret) file.close() ab+ 以二進(jìn)制格式打開一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文 件的結(jié)尾。如果該文件不存在,創(chuàng)建新文件用于讀寫。
四、文件高級(jí)操作
-
調(diào)用 read()會(huì)一次性讀取文件的全部?jī)?nèi)容,如果文件有 10G,內(nèi)存就爆了,會(huì)導(dǎo)致程序卡死,
所以,要保險(xiǎn)起見,可以反復(fù)調(diào)用 read(size)方法,每次最多讀取 size 個(gè)字符的內(nèi)容file = open("demo1/111.txt","r") ret1 = file.read(5) ret2 = file.read(5) # print(ret1) print(ret2) file.close() -
readline 每次讀取一行,并且自帶換行功能 每一行末尾會(huì)讀到\n可以指定每行讀取的字符長(zhǎng)度,下一次讀取會(huì)從此位置開始
f = open("demo1/4.txt","r") # ret = f.read() print(f.readline(3)) print(f.readline(3)) print(f.readline(3)) f.close() -
readlines,一次性以行的形式讀取文件的所有內(nèi)容并返回一個(gè) list,需要去遍歷讀出來
f = open("demo1/4.txt","r") ret = f.readlines() # print(ret) for i in ret: print(i,end='') f.close() -
file 句柄是一個(gè)可迭代的對(duì)象因此,可以循環(huán)讀取文件中的內(nèi)容,每次讀一行
f = open("demo1/4.txt","r") # print(f) #文件句柄,是一個(gè)可迭代對(duì)象 for i in f: print(i) f.close() -
write和writelines(多行一次性寫入)
file = open("demo1/5.txt","w") # file.write("yangyong") # file.write("zhuzucheng") # lst = ["yangyong","zhuzucheng"] #列表中必須是字符串 lst = ["yangyong","zhuzucheng",10] # for i in lst: # file.write(i) file.writelines(lst) file.close() -
cvs文件讀寫
- 寫入 CSV 文件 必須創(chuàng)建 csv 模塊中對(duì)應(yīng)的 writer 對(duì)象,通過 writer 對(duì)象完成文件內(nèi)容的寫入操作
f = open("demo1/movie.csv","w",newline='') writer = csv.writer(f) writer.writerow(["電影名稱","評(píng)分","演員","網(wǎng)址"]) writer.writerows([["唐人際探案1","8.5","劉昊然","www.movei1.com"], ["唐人際探案2","8.6","劉昊然","www.movei2.com"], ["唐人際探案3","8.7","劉昊然","www.movei3.com"]]) f.close()- 讀取 csv 文件的操作,主要通過 csv 模塊中的 reader 對(duì)象來完成,通過加載文件數(shù)據(jù)到 reader 對(duì)象中,文件中的數(shù)據(jù)就會(huì)按照固定的格式讀取到程序中進(jìn)行處理
f = open("demo1/movie.csv","r",newline='') reader = csv.reader(f) # print(reader) #<_csv.reader object at 0x0000000001EACCE0> for i in reader: print(i) f.close()將豆瓣電影寫入csv文件:電影名稱,評(píng)分,演員,網(wǎng)址
from demo1.movie import movie_dict2 print(movie_dict2) for i in movie_dict2["data"]: #遍歷列表,取出字典對(duì)應(yīng)的數(shù)據(jù) print(i['title'],i['rate'],i['casts'],i['url']) f = open("demo1/movie2.csv","w",newline='') writer = csv.writer(f) writer.writerow(["電影名稱","評(píng)分","演員","網(wǎng)址"]) for i in movie_dict2["data"]: movie_name = i['title'] rate = i['rate'] casts = i['casts'] url = i["url"] writer.writerow([movie_name,rate,casts,url]) f.close()
五、os模塊
import os
-
1.重命名文件 os.rename(舊文件名,新文件名)
重命名文件 os.rename(舊文件名,新文件名) os.rename("demo1/3.txt", "demo1/333.txt") -
2.刪除文件 os.remove(文件名)
刪除文件 os.remove(文件名) os.remove("demo1/111.txt") -
3.創(chuàng)建目錄
- 創(chuàng)建單層目錄 os.mkdir(目錄名)
os.mkdir("demo2")- 創(chuàng)建多級(jí)目錄 os.makedirs(多級(jí)目錄)
-
4.刪除目錄
- 刪除單層目錄 os.rmdir(目錄名)
os.rmdir("demo2")- 刪除多層目錄 os.removedirs(多級(jí)目錄)
若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,繼續(xù)刪除,以此類推,如果上一次目錄不為空,則停止刪除文件
os.removedirs("a/b/c/d") -
5.獲取當(dāng)前所在目錄 os.getcwd()
print(os.getcwd()) -
6.獲取目錄列表 os.listdir(path) path是路徑
print(os.listdir(os.getcwd())) print(os.listdir("demo_03os模塊.py")) #必須是目錄 print(os.listdir("a")) -
7.切換所在目錄 os.chdir(path)
os.chdir("a") with open("1.txt","w") as f: f.write("hello") -
8.判斷文件或文件夾是否存在os.path.exists()
print(os.path.exists("a")) #True print(os.path.exists("1.txt")) #False -
9.判斷是否是文件 os.path.isfile(path)
print(os.path.isfile("a")) #False print(os.path.isfile("demo_01文件基本操作.py")) #True -
10.判斷是否是目錄 os.path.isdir(path)
print(os.path.isdir("a")) #True print(os.path.isdir("demo_01文件基本操作.py")) #False
異常
定義:異常是指在語法正確的前提下,程序運(yùn)行時(shí)報(bào)錯(cuò)就是異常
-
當(dāng)python腳本發(fā)生異常時(shí),我們應(yīng)該捕獲它,否則程序會(huì)終止執(zhí)行
print("hello world") print(1/0) print("代碼結(jié)束") -
異常處理 try...except
- 程序自上往下執(zhí)行,先執(zhí)行try中的代碼,如果代碼中有異常,則不會(huì)繼續(xù)執(zhí)行try下面的代碼,會(huì)執(zhí)行except中的異常代碼
- 如果try中沒有異常,則不會(huì)執(zhí)行except中的代碼
try: print("hello") print(1/0) print("world") except: print("try中有異常代碼") print("代碼結(jié)束") #ZeroDivisionError,IndexError,NameError,TypeError,FileNotFoundError -
try...except...else
- try中代碼正常執(zhí)行結(jié)束,不會(huì)走except,走else
- try中有異常,會(huì)走except,不走else
try: print("hello") # print(1/0) print("world") except: print("出現(xiàn)異常") else: print("else中的代碼") print("finish") -
try..except...else ...finally
-
無論代碼是否有異常,都會(huì)走finally
try: print("hello") # print(1/0) print("world") # except ZeroDivisionError: # print("0為除數(shù)的異常") except NameError: print("命名異常") else: print("else中的代碼") finally: print("finish")
-
-
獲取異常信息
try: print("hello") print(1/0) print("world") # except BaseException as e: except Exception as e: print(e)
觸發(fā)異常
-
用戶可以根據(jù)業(yè)務(wù)邏輯手動(dòng)拋出異常
并且用戶可以根據(jù)需求來拋出系統(tǒng)異常和用戶的自定義異常
try: name = input("請(qǐng)輸入注冊(cè)用戶名:") if name.isalpha(): raise Exception("不可以全部是字母") except Exception as e: print(e)