1、基本的文件操作
python中內置了文件(fFle)對象,使用文件對象的大概流程如下:
1、創建文件(通過內置open()函數)
2、通過該對象提供的方法進行一些基本的文件操作,如write()、close()等方法
1.1、創建和打開文件
可以通過open()方法實現
語法格式:
file = open(filename[,mode[,buffering]])
說明:
file:爲被創建的文件對象
filename:要創建或者打開的文件名,可以使用絕對路徑和相對路徑
mode:可選參數,用於指定文件的打開模式,默認打開模式爲只讀(r)
buffering: 可選參數,用於指定讀寫文件的緩存模式,值爲0表示不緩存,1表示緩存,大於1表示緩衝區的大小,默認爲讀寫模式
1.11、當打開不存在的文件,會拋出異常,解決辦法有
1、創建該文件
2、在調用open()函數時,指定mode的參數值爲w、w+、a、a+。這樣的話,如果要打開的文件不存在就會自動創建新文件,歸根到底還是和第一鍾方法相聯繫
1.12、以二進制的形式打開文件
open()函數不僅可以以文本形式打開文件,還可以以二進制形式打開文件,只要將mode參數設置爲rb、 rb+、 wb、 wb+、 ab 、ab+,就可以
如
file = open('1.jpg', 'rb')
print(file)
輸出
<_io.BufferedReader name='1.jpg'>
可以看出創建的是一個BufferedReader(緩衝區讀取)對象,該對象生成後我們可以使用第三方模塊進行處理,如PIL的Image模塊。
1.13、 打開文件時指定編碼方式
open()方法打開文件時,默認爲GBK編碼,如果被打開的文件的編碼不是GBK那麼會拋出異常
解決方法
1、直接修改文件的編碼
2、打開文件時,指定使用的編碼方式(推薦)。在使用open函數打開文件時,使用encoding= ‘編碼方式’,指定編碼方式。
如,打開採用UTF - 8編碼保存的文件1.txt
file = open('1.txt1','r',encoding= 'utf -8')
1.2、關閉文件
文件打開後,使用完要及時關閉文件。可以使用close()方法
語法格式
file.close()
說明:close()方法會先刷新緩衝區中未寫入的數據,然後再關閉文件。這樣可以將未寫入文件的數據寫入文件。文件關閉後,不能再進行寫操作
1.3、打開文件時使用with語句
如果在打開文件時如果拋出了異常,那麼可能無法及時關閉文件。我們可以使用with語句避免這個問題
語法格式:
with expression as target
with_body
參數說明:
expression:用於指定一個表達式,這邊可以是open()函數
target: 用於指定一個變量,並將expression的結果保存到該變量裏
with-body:用於指定with語句體,其中可以是執行with語句後的相關一些操作語句,也可以是pass
如
with open('1.jpg', 'rb') as file:
pass
1.4、寫入文件內容
使用write()函數
語法格式
file.write(string)
部分參數說明:
string爲要寫入的字符串
使用write()方法的前提是,在打開文件時,指定的打開模式爲w(可寫)或者a(追加)等等
1.5、讀取文件
讀取文件主要分爲以下3種情況。
1.51、讀取指定字符串
1、從頭開始讀取文件內容
使用read()方法,語法格式
file.read([size]) #size用於指定要讀取的字符個數,如果省略,則一次性讀取全部
例子,注意打開模式只能爲r或者r+
with open('2.txt', 'r+') as file:
print(file.read(2))
2、讀取部分內容
使用seek()方法將指針移動到新的位置,再用read(size)方法讀取。seek()基本語法
file.seek(offset[,whence])
部分參數說明
offset:用於指定移動的字符個數,其具體位置與whence有關
whence:用於指定從什麼位置開始算。0表示從文件頭開始計算,1表示當前位置,2表示文件尾,默認爲0。
注意
如果在打開文件時,沒有使用b模式,那麼只允許從文件頭開始計算,從文件尾會報錯。
使用seek()方法時,offset的值是一個漢字佔2個字符,一個數字或者英文佔一個字符,與read()方法不同。
例子
with open('2.txt', 'r') as file:
file.seek(3)
print(file.read(2))
1.52、讀取一行
使用readline()方法,語法格式
file.readline()
文件的打開模式要求與使用read()方法一樣
例子,一行一行輸出2.txt裏的內容
with open('2.txt', 'r', encoding="utf-8") as file:
number = 0 # 記錄行號
while True:
number += 1
line = file.readline()
if line == '':
break
print(number, line) # 輸出一行的內容
1.53、讀取全部行
使用readlines()方法,語法格式
file.readlines() # 返回類型爲字符串列表
例子:
2.txt文件內容爲
學無止境
python有趣
好好學習
天天向上
with open('2.txt', 'r', encoding="utf-8") as file:
print(file.readlines())
輸出
['學無止境\n', 'python有趣\n', '好好學習\n', '天天向上']
可以看出返回一個字符串列表,但是如果文件比較大,這種方法效率太低,這時可以將列表內容逐行輸出,修改後的代碼爲
with open('2.txt', 'r', encoding="utf-8") as file:
a = file.readlines()
for i in a:
print(i)
2、目錄操作
python中並沒有直接提供操作目錄的函數或者對象,而是通過內置的os和os.path模塊實現。
其中os模塊是python內置的與操作系統功能和文件系統相關的模塊,該模塊上執行結果通常與操作系統有關,在不同的操作系統上執行可能會有不同的效果
這邊的操作系統爲windows系統
2.1、os和os.path模塊
要使用os和os.path模塊 ,首先要使用import語句導入,代碼如下
import os
導入os模塊後,也可以使用其子模塊os.path
os模塊提供的常用的變量有以下幾個
1、name:用於獲取操作系統類型
如
import os
print(os.name)
輸出
nt # nt爲windows系統,posix爲Linux、UNIX或者Mac OS操作系統
2、linesep:用於獲取當前操作系統的換行符
3、sep:用於獲取當前存在系統的路徑分隔符
os模塊提供的與目錄相關的函數
getcwd() | 返回當前的工作目錄 |
---|---|
listdir(path) | 返回指定路徑下的文件和目錄信息 |
mkdir(path [,mode]) | 創建目錄 |
kakedirs(path1/path2/…) | 創建多級目錄 |
rmdir(path) | 刪除目錄 |
removedirs(path1/path2/…) | 刪除多級目錄 |
chdir(path) | 把path設置爲當前工作目錄 |
walk(top [,topdown[,onerror]]) | 遍歷目錄樹,該方法返回一個元組,包括所有路徑名、所有目錄列表和文件列表3個元素 |
os.path模塊提供的與目錄相關的函數
函數 | 說明 |
---|---|
abspath(path) | 用於獲取文件或目錄的絕對路徑 |
exists(path) | 用於判斷路徑是否存在,存在返回True,不存在返回False |
join(path,name) | 將目錄與目錄或者與文件名拼接起來 |
splitext() | 分離文件名和擴展名 |
basename(path) | 從一個目錄中提取文件名 |
dirname(path) | 從一個路徑中提取文件路徑,不包括文件名 |
isdir(path) | 用於判斷是否爲路徑 |
2.2、路徑
1、包括絕對路徑和相對路徑
2、可以使用os模塊提供的getcwd()函數獲取當前工作目錄
代碼如下
import os
print(os.getcwd())
在python中,指定文件路徑時要對路徑分隔符進行“\”轉義,即將路徑分隔符
“\”替換爲"\"。也可以用“/”代替。
3、拼接目錄
使用os.path.join()函數進行拼接,
語法格式爲
os.path.join(path1 [,path2[,.......]])
(1)、path1、path2爲要拼接的路徑,如果要拼接的路徑中沒有一個是絕對路徑那麼拼接出來的路徑就是相對路徑。
(2)、使用 os.path.join()拼接路徑時,並不會檢測該路徑是否真實存在
如
import os
print(os.path.join("E:\\Pyth", "web\\ 1.txt"))
輸出
E:\Pyth\web\ 1.txt
在使用os.path.join()函數時,如果要拼接的路徑中有多個絕對路徑,那麼以從左到右最後一次出現的爲準,之前的參數會被忽略,如
import os
print(os.path.join("E:\\Pyth", "D:\\txt" , "demo"))
輸出
D:\txt\demo
注意:2個路徑要拼接在一起時,不要直接使用字符串拼接,而是使用os.path.join()函數,這樣可以處理不同操作系統的分隔符。
2.3、判斷目錄是否存在
使用os.path.exists()函數,語法格式如下
os.path.exists(path)
路徑存在返回True,不存在返回False,path可以爲絕對路徑或者相對路徑,該函數還可以判讀文件算法存在
2.4、創建目錄
2.41、創建一級目錄
使用os.mkdir()函數創建目錄,該函數只能創建一級目錄,也就是知道路徑的最後一級目錄,如果該目錄的上一級目錄不存在,則會拋出異常,如果要創建的路徑已經存在也會拋出異常
語法格式
os.mkdir(path,mode= 0o777)
mode用於指定數值的模式,默認值爲0777,該參數在非UNIX系統時無效或者被忽略
如,創建一個C:\demo目錄(windows系統)
import os
os.mkdir("C:\\demo")
那如何避免上面所說的創建的路徑已經存的問題呢。可以使用以下代碼,先判斷,再創建
import os
path = "C:\\demo"
if not os.path.exists(path): # 判斷目錄是否存在
os.mkdir(path)
print("創建目錄成功")
else:
print("目錄已經存在")
2.42、創建多級目錄
使用os.makedirs()函數,語法格式
os.makedirs(name, mode = 0o777)
name:用於指定要創建目錄
例子
在windows系統上創建一個多級目錄
import os
path = "C:\\demo\\web\\mr"
os.makedirs(path)
2.5、刪除目錄
通過os.rmdir()函數可以刪除目錄,且要刪除的目錄爲空時纔有效,語法格式
os.rmdir(path)
如
import os
path = "C:\\Desktop\\web"
os.rmdir(path)
刪除後的目錄
C:\Desktop\web
如果目錄不存在會拋出異常,將代碼進行改進
import os
path = "C:\\Desktop\\web"
if os.path.exists(path):
os.rmdir(path)
print("目錄成功刪除")
else:
print("該目錄不存在")
注意:
os.rmdir()函數只能刪除空目錄,如果要刪除非空目錄,可以使用python中內置模塊shutil的rmtree()函數實現。
如,刪除不爲空的目錄C:\Desktop\web
import shutil
shutil.rmtree("C:\\Desktop\\web")
2.6、遍歷目錄
使用os.walk()函數,語法如下
os.walk(top [, topdown] [,onerror] [,follwlinks])
參數說明
top:用於指定要遍歷的內容的根目錄
topdown:可選參數用於指定遍歷的順序,值爲True就是自上而下的遍歷(從根目錄開始),如果值爲False就是自下而上的遍歷。默認爲True
onerror: 可選參數,用於指定錯誤處理方式,默認忽略,也可以指定一個錯誤處理函數,一般採用默認
followlinks: 可選參數,在默認情況下,walk()函數不會向下轉換成解析到目錄的符號鏈接。將該參數值設置爲True,表示用於在支持的系統上訪問由符號鏈接指向的目錄
返回值: 返回3個元素(dirpath、dirnames、filenames)的元組生成器對象。dirpath表示當前遍歷的路徑,是一個字符串;dirnames表示當前路徑下包含的子目錄,是一個列表,filenames表示當前路徑下包含的文件,是一個列表
如,遍歷D:\Python\web目錄
import os
# 遍歷D:\Python\web目錄
tuples = os.walk("D:\\Python\\web")
for tuplel in tuples: # 通過for循環輸出遍歷結果
print(tuplel, '\n')
注意:walk()函數只在windows系統和UNIX系統中有效。
3、文件的高級操作
os模塊中與文件相關的函數
函數 | 說明 |
---|---|
access(path,accessmode) | 獲取對文件是否有指定的訪問權限(讀取,寫入,執行權限)。accessmod的值是R_OK(讀取)、W_OK(寫人)、X_OK(執行)或F_OK(存在)。如果有指定的權限,則返回1,否則返回0 |
chmod(path,mode) | 修改path指定文件的訪問權限 |
remove(path) | 刪除path指定的文件路徑 |
rename(src,dst) | 將文件或目錄src重命名爲dst |
stat(path) | 返回path指定文件的信息 |
startfile(path [,operation]) | 使用關聯的應用程序打開path指定的路徑 |
3.1、刪除文件
使用os.remove()函數,語法格式
os.remove(path)
如,刪除當前目錄下的2.txt文件,代碼如下
import os
path = "2.txt" # 使用相對路徑(絕對路徑也可以),要刪除的文件
if os.path.exists(path): # 判斷文件是否存,防止文件不存在時拋出異常
os.remove(path)
print("文件刪除成功")
else:
print("該文件不存在")
3.2、重命名文件和目錄
使用os.rename()函數,如果指定的路徑是文件,則重命名文件,如果是目錄,則重命名目錄,語法格式
os.rename(src,dst)
例子:將當前目錄下的2.txt重命名爲1.txt
import os
src = "D:\\Python\\web\\2.txt"
dst = "D:\\Python\\web\\1.txt" # 使用絕對路徑(相對路徑也可以),要刪除的文件
if os.path.exists(src): # 判斷文件是否存
os.rename(src, dst)
print("文件重命名成功")
else:
print("該文件不存在")
值得注意的是使用rename()函數重命名目錄時操作與重命名文件一樣,但是隻能修改最後一級的目錄名稱,否則會拋出異常。
3.3、獲取文件的基本信息
通過os.stat()函數可以獲取文件的基本信息,語法格式如下
os.stat(path)
start()函數返回式的對象的常用屬性
屬性 | 說明 | 屬性 | 說明 |
---|---|---|---|
st_mode | 保護模式 | st_dev | 設備名 |
st_ino | 索引號 | st_uid | 用戶ID |
st_nlink | 硬連接號(被連接的數目) | st_gid | 組ID |
st_size | 文件大小,單位爲字節 | st_atime | 最後一次詢問時間 |
st_mtime | 最後一次修改時間 | st_ctime | 最後一次狀態變化的時間(不同系統不一樣,如windows系統返回的是問卷創建的時間) |
4、牛刀小試
1、查找特定目錄D:\Python\web下以m開頭的文件
import os, re
input_dir = os.walk("D:\\Python\\web")
for dirPath, dirNames, fileNames in input_dir: # 根據os.walk輸出目錄信息
for fileName in fileNames: # 對文件列表進行遍歷
pattern = r'^m+' # 模式字符串
match = re.match(pattern, fileName) # 查找匹配條件的文件名
if match: # 判斷是否匹配成功
print(os.path.join(dirPath, fileName)) # 拼接目錄和文件名,並輸出
或者
import os, re
input_dir = input("please input the search dir:")
for dirPath, dirNames, fileNames in os.walk(input_dir): # 根據os.walk輸出目錄信息
for fileName in fileNames: # 對文件列表進行遍歷
pattern = r'^m+' # 模式字符串
match = re.match(pattern, fileName) # 查找匹配條件的文件名
if match: # 判斷是否匹配成功
print(fileName)
print(os.path.join(dirPath, fileName)) # 拼接目錄和文件名,並輸出
2、複製C盤下的1.log文件到你的程序目錄,然後修改日誌中的所有的Aug爲wr,並把修改後的文件保存到wr.txt
import shutil
shutil.copyfile('C:\\1.log', 'D:\\Python\\web\\1.txt') # 複製文件到程序目錄下
file = open('1.txt', 'r')
file_new = open('wr.txt', 'w')
for line in file: # 按行讀取文件內容
if "Aug" in line: # 查找我們所需要修改的內容
line = line.replace("Aug", "wr") #替換Aug爲wr
file_new.write(line) #修改後的內容寫入新文件裏
file.close()
file_new.close()
或者
import shutil
shutil.copyfile('C:\\1.log', 'D:\\Python\\web\\1.txt')
with open('1.txt', 'r') as file:
with open('wr.txt', 'w') as new_file:
for line in file:
if "Aug" in line:
line = line.replace("Aug", "wr")
new_file.write(line)