一文看懂Python對文件和文件夾的操作: 含os, shutil和glob模塊.Python學習面試必讀.

2021-02-19 Python Web與Django開發

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+以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。
File對象的屬性

一個文件被打開後,你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大咖之路]. 原創教程和實戰案例每日更新.

相關焦點

  • Python常用模塊os和shutil學習
    os就是「operating system」的縮寫,python中的os模塊提供了對目錄或者文件的新建/刪除/查看等屬性,還提供了對文件以及目錄的路徑操作,比如創建、刪除目錄等。關於OS模塊的目錄操作,可以看一下這篇文章:Python目錄操作總結下面是os模塊常用方法思維導圖shutil模塊shutil模塊屬於高級文件操作模塊,可以做os模塊的補充,主要可以實現文件的複製和解壓縮操作等等。
  • 文件操作So Easy!來,一起體驗下Python的Pathlib模塊~
    (os.path.expanduser('~'), 'realpython.txt'))在本教程中,你將了解如何使用pathlib模塊操作目錄和文件的名稱。學習如何讀取和寫入文件,拼接路徑和操作底層文件系統的新方法,以及如何列出文件并迭代它們的一些示例。
  • Python的os / shutil / Path 模塊介紹
    Python中對文件、文件夾(文件操作函數)的操作需要涉及到os模塊和shutil模塊。
  • 【Python基礎】Python十大文件騷操作!!
    來源:Python數據科學作者:東哥起飛日常對於批量處理文件的需求非常多,用Python寫腳本可以非常方便地實現,但在這過程中難免會和文件打交道,第一次做會有很多文件的操作無從下手,只能找度娘。該函數將在指定的路徑下創建目錄,如果僅使用目錄名稱,則將在當前目錄中創建文件夾,即絕對路徑和相對路徑的概念。
  • Python 文件與目錄操作方法總結
    Python 有很多內置的模塊和函數可用於文件的操作處理,這些函數都分布在幾個模塊上:如 os,os.path,shutil 和pathlib 等等。本文收集了許多您需要知道的函數,以便在 Python 中對文件執行最常見的操作。
  • Python十大文件騷操作!!
    該函數將在指定的路徑下創建目錄,如果僅使用目錄名稱,則將在當前目錄中創建文件夾,即絕對路徑和相對路徑的概念。刪除目錄和文件完成對某些文件或文件夾的操作後,我們可能希望刪除它。為此,我們可以使用os模塊中的remove()函數來刪除文件。如果要刪除文件夾,我們應該改用rmdir()。
  • python基礎模塊三劍客:sys、os、shutil
    前面,我們學習了python模塊的基本概念、如何安裝第三方模塊,並學習了寫自己的模塊和包。
  • Python辦公自動化不得不會的十大文件操作!
    ,用Python寫腳本可以非常方便地實現,但在這過程中難免會和文件打交道,第一次做會有很多文件的操作無從下手,只能找度娘。該函數將在指定的路徑下創建目錄,如果僅使用目錄名稱,則將在當前目錄中創建文件夾,即絕對路徑和相對路徑的概念。
  • 數據處理技巧 | glob - 被忽略的超強文件批量處理模塊
    今天我將介紹Python自帶的一個模塊-glob模塊。涉及的內容主要如下:Python-glob模塊簡介glob模塊通配符glob模塊是python自己帶的一個文件操作模塊,可以查找符合自己需求的的文件,並且支持通配符操作,主要包括以下三種匹配模式:**匹配所有文件,包括目錄,子目錄和子目錄裡面的文件。
  • Python內置的文件夾操作
    文件夾主要用於分層保存文件,通過文件夾可以進行區別存放文件。Python中,沒有提供直接操作文件夾的方法,需要使用內置的os、os.path和shutil模塊來實現。註:若複製的文件夾下還有二級文件夾,將整體複製過去import shutilshutil.copytree(r"G:\Projectfile\demo",r"F:\test")5、用電文件夾Python中複製文件夾使用shutil模塊提供的
  • 一文看懂Python列表表達式及高階函數如lamda, zip, enumerate, map和filter方法.
    , sorted方法是python學習,面試和工作的必備技能。正是它們給了python優秀的特性,從而使python有別於其它程式語言。網上的介紹和教程有很多,但感覺還是比較零散,解讀也不夠深入,小編決定再次動手寫篇總結。如果大家還沒讀過小編寫的一文看懂python系列文章,請先閱讀一文看懂Python面向對象編程(Python學習與新手入門必看)-絕對原創和一文看懂Python對文件和文件夾的操作: 含os, shutil和glob模塊。
  • 【python】os 模塊使用筆記
    Python內置的os模塊可以調用作業系統提供的接口函數,對文件或目錄進行操作(實際上作業系統是不允許應用程式直接訪問和操作文件和目錄的,讀寫文件就是請求作業系統打開一個文件對象,通常稱為文件描述符。然後,通過作業系統提供的接口從這個文件對象中讀取數據,或者把數據寫入這個文件對象。)os模塊一般有以下功能:
  • Python文件處理實用指南
    今天就來總結性地學習和回顧一下,Python各類文件處理。一、open()模式open()函數open(文件名,操作模式)函數用來以指定的模式打開一個給定文件名的文件。二、獲取目錄列表基礎的目錄列表獲取函數通過os模塊通過pathlib模塊實例演示文件夾的結構如下所示:
  • 用Python拷貝word圖片到指定文件
    作者:小小明,Pandas數據處理專家,致力於幫助無數數據從業者解決數據處理難題編輯:朱小五,一隻不務正業的數據狗日常工作中,領導要求你將一份 Word 文檔中的圖片存儲到一個文件夾內,你可能會一邊內心崩潰,一邊開始一張張的 另存為
  • Python3菜鳥教程:如何在Python中刪除文件和目錄
    本教程說明了如何使用os,pathlib和shutil模塊中的函數刪除文件和目錄。刪除文件在Python中,您可以使用os.remove(),os.unlink(),(),pathlib.Path.unlink()刪除單個文件。os模塊提供了一種與作業系統交互的可攜式方法。該模塊可用於Python 2和3。
  • Python自動化整理文件「大升級」,任意路徑下文件,都給你整理的明明白白!
    https://www.cnblogs.com/huny/p/14146719.html大家好,我是為大家分享「乾貨」和「黑科技」的黃同學!1. 前言工作上的文檔和資料好幾個月沒整理了,因為平常太忙都是隨手往桌面丟。整個桌面雜亂無章全是文檔和資料。幾乎快佔滿整個屏幕了,所有我必須要整理一下了。但是手動整理太費時間了,於是我想到了python。
  • 了解這些操作,Python中99%的文件操作都將變得遊刃有餘!
    圖源:unsplashshutilshutil是用於移動、複製和刪除文件(夾)的最著名的模塊。它有3種僅供複製文件的方法:copy(),copy2()和copyfile()。如果要異步執行程序,則可以使用threading,multiprocessing或subprocess模塊,這三個模塊能使文件操作在單獨的線程或進程中運行。
  • Python一鍵自動化整理文件,任意路徑下文件,都給你整理的明明白白!
    前言工作上的文檔和資料好幾個月沒整理了,因為平常太忙都是隨手往桌面丟。整個桌面雜亂無章全是文檔和資料。幾乎快佔滿整個屏幕了,所有我必須要整理一下了。但是手動整理太費時間了,於是我想到了python。2.
  • Python尚學堂高淇|P137-P139OS模塊,文件和目錄的操作,使用walk遍歷os.path模塊
    P137-OS模塊-文件和目錄的操作os 模塊-文件和目錄操作
  • 使用Python圖像處理庫Pillow處理圖像文件
    +sys.argv[2]for infile in glob.glob(img_path):   f,e = os.path.splitext(infile)   outfile = f + "." + sys.argv[3]   PIL.Image.open(infile).save(outfile)(1)glob模塊可以使用通配符匹配文件名