#####################第一部分:::文件的基本操作
讀 r (read) ; 寫 w (write) ; 執行 x ; 追加 a (append)
文件打開的模式:
模式: 描述:
r 以只讀方式打開文件,文件指針默認放在文件開頭,文件不存在則報錯。
r+ 打開一個文件用於讀寫,文件指針默認放在文件開頭,文件不存在則報錯。
w 打開一個文件用於寫入,如果該文件已存在則將其覆蓋,如果不存在,創建新文件。
w+ 打開一個文件用於讀寫,如果該文件已存在則將其覆蓋,如果不存在,創建新文件。
a 打開一個文件用於追加,如果文件已存在,文件指針會放在文件末尾(也就是說,新的內容將會被寫到已有內容之後)如果不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫,如果文件已存在,文件指針會放在文件結尾,文件打開時會是追加模式,如果不存在,創建新文件用於讀寫。
其他模式 : rb rb+ wb wb+ ab ab+
加個b的作用:以二進制的格式打開文件(比如操作音頻文件,圖片文件,視頻文件…),進行上述操作。
1.如何打開/關閉一個文件
打開文件:
f = open(flie_path,mode = “r”) #有兩個參數,第一個參數是文件的位置(可以是絕對路徑,也可以是相對路徑),第二個參數是打開的方式,默認r
傳入表示文件路徑的字符串,會返回一個文件對象。
關閉文件:
f.close()
調用給定文件對象的close方法
注意:打開一個文件操作完之後,一定要關閉。
需要知道的小知識點:
(1)windows系統中:
相對路徑:不帶盤符的
絕對路徑:帶盤符的
(2)光標位置:
1.如果讀完了就讀不了了,因爲光標的位置在最後
2.通過seek方法重新調整光標的位置
3.寫完了後,光標位置在最後
例子看看:
f = open(r’C:\my\pycharm_work\ceshi.py’,‘r+’)
f.read()
‘wumou love zhangmou’f.read() #現在就讀不了了,因爲光標在上一次讀完之後移動到了最後。
‘’f.seek(0) #把光標位置調整到最前面,那麼光標後面就有內容了
0f.read() #現在就可以讀到內容了
‘wumou love zhangmou’f.tell() #可以查看光標的位置
24f.seek(0)
0f.tell()
0
拓展:
1.讀取指定大小的內容:
變量名.read() #括號里加要讀的指定的字符串長度,不寫則全讀
2.讀取文件某一行的內容:
變量名.readline()
3.讀取文件多行:
變量名.readlines() #括號內可以指定要讀的行數,不寫則全讀,全讀的話會變成列表的形式。
4.寫入內容:
f.write(變量名)
5.寫入多行:(注意換行需要自己加代碼)
變量名.writelines(變量名)
來個例子看看:
f = open(r’C:\my\pycharm_work\ceshi.py’,‘r+’)
f.read()
‘’f.writelines(‘wumou \n zhangmou \n haha’)
f.seek(0)
0f.read()
‘wumouzhangmouzhangmouwumou \n zhangmou \n haha’f.seek(0)
0f.readline() #這樣是一下查看一行。
‘wumouzhangmouzhangmouwumou \n’f.readline()
’ zhangmou \n’f.seek(0)
0f.readlines() #這樣是一下查看全部行。
[‘wumouzhangmouzhangmouwumou \n’, ’ zhangmou \n’, ’ haha’]
6.立即刷新緩衝:
變量名.flush() #可以理解爲保存
舉個例子:
文件內容是: wumou
f1 = open(r’C:\my\pycharm_work\ceshi.py’,‘a’)
f1.write(‘shuai’)
5f2 = open(r’C:\my\pycharm_work\ceshi.py’,‘r’)
f2.read() #會發現現在讀是讀不到剛剛以追加方式寫進入的內容shuai
‘wumou’f1.flush() #我們立即刷新緩衝,那麼下面就可以讀到了。此處作用相當於在進行文件操作之後進行保存
f2.seek(0)
0f2.read()
‘wumoushuai’
7.獲取遊標位置:
變量名.tell()
8.調整遊標的位置:
變量名.seek(position)
總結:
持久存儲:保存內存中數據都是易丟失的,只有保存在硬盤中才能持久的存儲,保存在硬盤中的基本方法就是把數據寫入文件中
打開和關閉:在python中文件的打開與關閉變得十分簡單快捷,文件在關閉的時候就會自動保存
#########################第二部分::StringIO與BytesIO
真文件:在關閉文件的時候文件內容不會丟失。
假文件:在關閉文件的時候文件內容會丟失。
(1)StringIO:
import io #創建IO操作:
sio = io.StringIO()
sio.write(‘好好學習,天天向上’) #寫入
print(sio.getvalue()) #可以多次讀取,沒有光標的問題存在
print(sio.getvalue()) #也可以獲取到
sio.close() #關閉
print(sio.getvalue()) #報錯,獲取不到。
# 當創建的StringIO調用 close() 方法時,
# 在內存中的數據會丟失
(2)BytesIO字節流:
BytesIO 和 StringIO 類似,但是BytesIO操作的是Bytes數據,decode解碼
import io
bio = io.BytesIO()
bio.write(b’hsfdhdsf124’) #如果寫入字母或者數字時,注意在引號前面加上b
print(bio.getvalue())
bio.write(‘吳某’.encode()) #如果寫入漢字的話,要進行編碼,默認爲utf-8
print(bio.getvalue().decode()) #那麼如果想獲取的話就要進行解碼,如果不解碼就是二進制形式
注意:
調用close()方法,保存內存中的數據,保證內存中的數據不會丟失。
防止佔用某一個資源。如果不關閉的話,那麼這個IO資源就會被他一直佔用,別人想用就沒法用了。
######################第三部分::上下文管理 with…as
作用:讓python自動執行關閉過程,即調用close()方法。
管理多個文件自動關閉。
首先來看,單個文件操作時:
with open(file_path, mode=‘r’) as f:
# 對f進行一系列操作
# 也可以執行別的操作
#跳出with語句快的時候自動執行f.close()
然後來看,多個文件操作時:
with open(file_path, mode=‘r’) as f1,
open(file_path, mode=‘r’) as f2,
.
.
.
open(file_path, mode=‘r’) as fn:
# 對f進行一系列操作
# 也可以執行別的操作
file.closed 查看文件是否關閉了
#跳出with語句塊的時候自動執行f.close()
最後來看看:
兩個底層方法:enter__和__exit
class Person:
def enter(self): # 進入的時候自動調用
print(‘this is enter’)
return ‘吳某好帥’
def __exit__(self,exc_type,exc_val,exc_tb): #退出的時候自動調用
print("this is exit")
#with可以打開類,進行多個方法的管理
a = Person()
with a as f: #with可以管理多個軟件,打開多個軟件。
print(111) #我們打開這個類,就會自動調用__enter__方法,然後進行打印111的操作
print(f) #f就是__enter__的返回值
#結束之後就會自動調用__exit__方法
輸出爲: this is enter
111
吳某好帥
this is exit
#####################第三部分::os模塊
(1)文件訪問編碼:
文件內容:
adafsd
asdfasdfd
sadfdsfds
sdafdsf
吳某
你真帥
hello
例子:::
with open(‘shuju.py’,‘r+’,encoding =‘ASCII’,errors = ‘ignore’) as f:
# 如果非想用ASCII編碼方法打開一個包含中文的文件
#(ASCII只能打開英文和數字,打開中文會報錯因爲解不了中文)
# 那麼就加個errors = ‘ignore’ 這樣就會忽略錯誤,直接跳過中文部分
print(f.read())
輸出爲:
adafsd
asdfasdfd
sadfdsfds
sdafdsf
hello
(2)os模塊 的目錄及文件操作:
#先要導入os模塊
import os
######################第一部分:::os模塊 的目錄及文件操作
#1.顯示當前路徑:os.getcwd()
print(os.getcwd()) #輸出爲:C:\my\pycharm_work
#2.展示當前目錄內容:os.listdir(path)
print(os.listdir(r’C:\my\pycharm_work’)) #輸出爲:[’.idea’,‘陰曆和陽曆轉換.py’]
#3.改變當前路徑: os.chdir(path)
print(os.getcwd()) # 輸出爲:C:\my\pycharm_work
os.chdir(r’C:\my’)
print(os.getcwd()) # 輸出爲:C:\my
#4.創建目錄: os.mkdir(文件名)
os.mkdir(‘a.py’)
print(os.listdir(r’C:\my\pycharm_work’)) # 輸出爲:[’.idea’, ‘a.py’, ‘陰曆和陽曆轉換.py’]
#5.刪除目錄: os.rmdir(文件名)
os.rmdir(‘a.py’)
print(os.listdir(r’C:\my\pycharm_work’)) #輸出爲:[’.idea’,‘陰曆和陽曆轉換.py’]
#6.使用Linux命令: os.system()
#7.刪除文件: os.remove(文件名)
#8.重命名: os.rename(“oldname”,“new”)
################第二部分:::os.path模塊 的路徑操作
#1.路徑拼接: os.path.join(path1,path2….)
a = os.path.join(r’C:\my\python’,r’pycharm_work’) # 注意第二個以及更多的路徑前不能加反斜槓
print(a) # 輸出爲:C:\my\python\pycharm_work
#2.所在目錄 / 父級目錄: os.path.dirname(路徑)
#3.基本短路徑: os.path.basename
#4.絕對路徑: os.path.abspath(路徑)
#5.相對路徑: os.path.relpath(路徑)
#6.資源大小: os.path.getsize(路徑) 獲取字節
#7.資源時間: os.path.getctime(路徑) /創建
#getatime(路徑) / 訪問
#getmtime(路徑) 修改
#8.路徑是否存在: os.path.exists(路徑)
#9.是否是目錄: os.path.isdir()
#10.是否是文件: os.path.isfile()
#11.是否是絕對路徑: os.path.isabs()