Django is Python。在利用Python或Django從事Web開發時除了必須要了解Python面向對象的編程思想,還必須熟練掌握對文件夾和文件的操作。小編我精心準備了個小結,教你如何利用python進行基本的文件和文件夾操作,並重點介紹了如何使用os, shutil和glob模塊進行常見的文件和文件夾操作,如遍歷,刪除文件和查找文件。
打開文件
如果你要對一個文件進行讀或寫,你必需先用Python內置的open函數打開它,創建一個文件對象File Object,你同時必需指定文件打開模式(讀,寫,還是讀和寫)。值得注意的是當你打開非文本文件如圖片或PDF時侯,必需用rb或wb模式。b代表二進位文件。例子如下。
# 以讀模式打開文本文件
txtFileObj = open('some.txt', 'r')
# 以讀模式打開非文本文件
pdfFileObj = open('some.pdf', 'rb')
常用文件打開模式如下:
模式描述r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。rb以二進位格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。一般用於非文本文件如圖片等。r+打開一個文件用於讀寫。文件指針將會放在文件的開頭。rb+以二進位格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。w打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。wb以二進位格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。w+打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。wb+以二進位格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。a打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。ab以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。a+打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。ab+以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。
一個文件被打開後,你j就有了一個file對象,這時你可以通過以下屬性得到有關該文件的各種信息,比如名字,訪問模式。
屬性描述file.closed返回true如果文件已被關閉,否則返回false。file.mode返回被打開文件的訪問模式。file.name返回文件的名稱。file.softspace如果用print輸出後,必須跟一個空格符,則返回false。否則返回true。閱讀文件
閱讀文件,你可以用file對象自帶的read方法。例子如下:
# 打開非文本文件
txtFileObj = open('some.txt', 'r')
print(txtFileObj.read())
# 打開非文本文件
pdfFileObj = open('original.pdf', 'rb')
pdfFileObj.read()
當你的文本文件有多行時,而你不想一次性列印出所有內容,你可以這麼做。
# 以讀模式打開非文本文件
txtFileObj = open('some.txt', 'r')
# 列印第5行
print(txtFileObj.read(5))
# 逐行列印
print(txtFileObj.readlines())
# 或者如下操作
for line in txtFileObj:
print(line)
寫入文件
要將數據寫入一個文件,你必需以寫或讀寫的模式先創建一個文件對象,然後使用write方法寫入。下面是兩個例子。
# 以寫模式創建文件對象,然後寫入
txtFileObj = open('some.txt', 'r+')
txtFileObj.write("Hello, world")
txtFileObj.close()
# 以寫模式打開非文本文件,然後寫入
f = some_data
with open('some.pdf', 'wb+') as pdfFileObj:
for chunk in f.chunks():
pdfFileObj.write(chunk)
關閉文件與with聲明
當你打開一個文件對象後,你一定要記住用f.close()關閉這個文件對象,這樣才會釋放系統資源。如果你老是忘記關閉一個文件,我們強烈建議使用python的with聲明打開一個文件。這樣在你完成文件讀寫操作後,python會自動關閉文件對象。例子如下:
# 以寫模式創建文件對象,然後寫入
with open('some.txt', 'r+') as txtFileObj:
txtFileObj.write("Hello, world")
python的os模塊, shutil模塊和glob模塊
python自帶的open,read, write是非常基本的文件操作。對於複雜點的文件夾和文件操作,我們需要藉助python的os模塊,shutil模塊和glob模塊。這些模塊都不需要額外的安裝,只需要import即可。
os模塊的常見功能
os模塊自帶的文件和文件夾操作方法都非常有用。
得到當前工作目錄的路徑: os.getcwd()
改變當前工作目錄: os.chdir(path)
返回指定目錄下的所有文件和目錄名:os.listdir(path)
函數用來刪除一個文件:os.remove(path)和os.unlink(path)
檢驗給出的路徑是否是一個文件:os.path.isfile(path)
檢驗給出的路徑是否是一個目錄:os.path.isdir(path)
判斷是否是絕對路徑:os.path.isabs()
檢查是否快捷方式os.path.islink (filename )
檢驗給出的路徑是否真地存在:os.path.exists(path)
返回一個路徑的目錄名和文件名:os.path.split() eg os.path.split('/home/python/django.html') 結果:('/home/python', 'django.html')
拼接工作路徑: os.path.join(str1, str2, str3..)
分離擴展名:os.path.splitext()
獲取路徑名:os.path.dirname(path)
獲取文件名:os.path.basename()
運行shell命令: os.system()
讀取和設置環境變量:os.getenv() 與os.putenv()
給出當前平臺使用的行終止符:os.linesep Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
指示你正在使用的平臺:os.name 對於Windows,它是'nt',而對於Linux/Unix用戶,它是'posix'
重命名:os.rename(old, new)
創建多級目錄:os.makedirs(r「c:\python\test」)
創建單個目錄:os.mkdir(「test」)
刪除單個目錄: os.rmdir(「test")
刪除多個目錄:os.removedirs(r「c:\folder」)
獲取文件屬性:os.stat()
修改文件權限與時間戳:os.chmod()
終止當前進程:os.exit()
獲取文件大小:os.path.getsize(filename)
值得注意的是windows和Linux採用了不同的路徑分隔符(「/」和"\"。我最喜歡的方法是os.path.join方法,提高了我們代碼可移植性。比如下面代碼:
os.path.join("python", "django", "some.py")
另外請記住刪除單個文件用os.remove()或os.unlink()。在Windows系統下刪除一個正在使用的文件會出現錯誤。刪除單個文件夾請用os.rmdir(), 但是該方法只能用於刪除一個空的目錄。 刪除多個目錄用os.removedirs(),如果子目錄刪除不成功(比如不為空),也會出現錯誤。
接下來我們再看幾個利用os模塊操作文件的實際案例,這些面試和實際工作中都需要了解的知識。
查找某個目錄下的全部txt文件並刪除。
假設我們在當前工作目錄下有個叫tutorial的文件夾,我們要把裡面的txt文件,刪除,我們可以這麼做:
>>> import os
>>> os.getcwd() # 獲取當前工作目錄
'C:\\Users\\MissEnka\\Python'
>>> os.listdir('tutorial') # 查看tutorial文件夾
['notes.txt', 'pdf docs', 'txtfiles']
>>> for filename in os.listdir('tutorial'):
if filename.endswith('.txt'):
os.remove(os.path.join('tutorial', filename))
print("{} deleted.".format(filename))
notes.txt deleted.
上段代碼有2點需要你注意的地方,你發現沒有?
我們只刪除了tutorial文件下的notes.txt文件,並沒有刪除子文件夾txtfiles裡的.txt文件。想要遍歷一個文件夾,查找所有目錄包括子目錄的文件,我們需要用到下面會提到的os.walk()方法。
我們用的os.remove(os.path.join("tutorial"), filename))而不是簡單用os.remove(filename)來刪除文件,這是因為notes.txt相對於當前工作目錄的路徑是/tutorial/notes.txt, 而不是notes.txt。
使用os.walk()遍歷一個文件夾子目錄查找所有txt文件並刪除
>>> for foldName, subfolders, filenames in os.walk('tutorial'):
for filename in filenames:
if filename.endswith('.txt'):
os.remove(os.path.join(foldName, filename))
print("{} deleted.".format(filename))
用os.walk()列印出某個文件夾下所有子目錄和文件名稱方法如下。來源: Automate the boring stuff with Python。
import os
folderName, subfolders, filenames in os.walk('directory'):
print('The current folder is ' + folderName)
for subfolder in subfolders:
print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
for filename in filenames:
print('FILE INSIDE ' + folderName + ': '+ filename)
print('')
利用shutil模塊複製和移動文件
shutil模塊可以用來複製和移動一個文件。shutil.copy()用來複製文件,第一個參數是需要複製的文件,第二個參數可以是文件夾,也可以是個文件名。如果是文件夾,新文件將存儲在新文件夾裡,文件名不變。如果是文件名,則新文件直接以文件名命名。shutil.copyfile()與shutil.copy()類似,只不過2個參數都必需是文件名。
>> import shutil
>> import os
>> os.chdir('C:\\')
>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'
shutil還常用來複製文件夾或移動文件,代碼如下:
# 複製文件夾. olddir和newdir都只能是目錄,且newdir必須不存在
shutil.copytree("老目錄", "新目錄")
# 移動文件(目錄)
shutil.move("老位置", "新位置")
利用glob模塊快速查找當前文件夾文件
glob模塊是最簡單的python模塊。它可以查找符合特定規則的文件路徑名,並返回所有匹配的文件路徑列表。類似正則表達式,glob支持三個匹配符:」*」, 「?」, 「[]」。」*」匹配0個或多個字符;」?」匹配單個字符;」[]」匹配指定範圍內的字符.
>>> import os
>>> os.getcwd()
'C:\\Users\\MissEnka\\Python'
>>> import glob
>>> glob.glob('*.txt')
['LICENSE.txt', 'list.txt', 'NEWS.txt']
>>> glob.glob('tutorial/.txt')
[]
>>> glob.glob('tutorial/*.txt')
['tutorial\\new.txt']
glob一般只搜索當前工作目錄或指定目錄裡的文件, 不能做文件夾遍歷, 用時需注意.
如果你喜歡我們的文章,歡迎關注我們的微信公眾號[Python與Django大咖之路]. 原創教程和實戰案例每日更新.