程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

[Python]文件相關操作和方法大全

編輯:Python

文章目錄

    • os.path
    • 文件
      • 文件讀寫
      • 文件刪除
      • 文件復制移動
    • 目錄
      • 創建目錄
      • 刪除目錄
      • 復制目錄
      • 枚舉目錄
      • 遍歷(游走)目錄
    • 文件名模式匹配
      • fnmatch
      • glob
    • 臨時文件與目錄

Python中有多個內置模塊來操作文件與目錄(os、os.path、shutil、pathlib等等)。

os.path

os.path模塊主要用於獲取文件的屬性,包含以下幾種常用方法:

路徑操作:

方法說明abspath(path)返回絕對路徑relpath(path[, start])從start開始計算相對路徑isabs(path)判斷是否為絕對路徑basename(path)返回文件名dirname(path)返回文件路徑join(path1[, path2[, …]])組合文件路徑split(path)路徑分割,返回(dirname,basename)元組splitext(path)分割擴展名,返回(root, ext)元組splitdrive(path)返回驅動器名和路徑組成的元組exists(path)判斷路徑是否存在lexists與exists類似,但當(軟連接等)路徑損害時返回True(exists會返回False)commonprefix(list)返回list(多個路徑)中,所有path共有的最長的路徑expanduser(path)把path中包含的""和"user"轉換成用戶目錄expandvars(path)根據環境變量的值替換path中包含的" n a m e " 和 " name"和" name"和"{name}"normpath(path)規范path,統一分隔符等(A//B, A/B/, A/./B and A/foo/../B)都會被規范為A/B
print(os.path.splitext('.info')) # ('.info', '')
print(os.path.splitext('test.txt')) # ('test', '.txt')
print(os.path.splitext(r'c:\tmp\test.txt')) # ('c:\\tmp\\test', '.txt')

屬性操作:

方法說明getatime(path)返回最近訪問時間(浮點型秒數)getmtime(path)返回最近文件修改時間getctime(path)返回文件創建時間getsize(path)返回文件大小,如果文件不存在就返回錯誤

文件類型判斷:

方法說明isfile(path)判斷路徑是否為文件isdir(path)判斷路徑是否為目錄islink(path)判斷路徑是否為鏈接ismount(path)判斷路徑是否為掛載點

文件

文件讀寫

Python中讀寫文件非常簡單,只需通過open函數以合適的方式打開,然後即可操作。

with open('data.txt', 'r', encoding='utf-8') as f:
data = f.read()
print('contents: {}'.format(data))

open()用於打開一個文件,並返回文件對象(打開失敗會拋出 OSError異常);文件對象不再使用時,一定要關閉(可用with語句保證自動關閉)。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

參數說明:

  • file: 文件路徑(相對或者絕對路徑)或文件句柄(interger)。
  • mode: 文件打開模式(默認是r)。
  • buffering: 設置緩沖(0:關閉緩沖;1:只對文本文件有效,設定行緩沖;其他:設定緩沖的字節數)。
  • encoding: 設置編解碼模式(只對文本模式有效,如’utf-8’)。
  • errors: 設定編解碼的報錯級別:
    • strict:默認,編解碼出錯時,拋出ValueError異常;
    • ignore:忽略編解碼錯誤(可能會丟失數據);
    • replace:使用替換標識(如’?')替代無效數據;
    • surrogateescape:使用私有區編碼(U+DC80 to U+DCFF)來替換錯誤字節;在處理未知編碼文件時有效;
    • xmlcharrefreplace:寫文件有效;錯誤字節被替換為XML字符(&#nnn;);
    • backslashreplace:使用Python’s backslashed escape sequences替換錯誤字節;
    • namereplace: 寫文件有效;錯誤字節被替換為\N{...}
  • newline: 文本文件有效,如何處理換行符
  • closefd: 使用文件句柄時,是否關閉;使用文件路徑時,必須為True;

打開模式Mode(t:文本;b:二進制):

模式描述t文本模式 (默認)b二進制模式r以只讀方式打開(文本)文件w以只寫方式打開(文本)文件;文件不存在,則創建新文件a以追加方式打開一個文件(文件指針在文件尾);文件不存在,則新建x新建一個文件(若文件已存在則報錯)+打開一個文件進行讀寫rb以只讀方式打開(二進制)文件r+打開一個文件用於讀寫(文件內容不清空,且文件指針在文件頭)wb以只寫方式打開(二進制)文件w+打開一個文件用於讀寫(文件存在,則先清空內容;否則,新建文件)a+打開一個文件用於讀寫(若文件已存在,文件指針在文件尾;若文件不存在,則新建文件)

文件對象的操作函數:

方法描述file.read([size])從文件讀取指定的字節數,如果未給定或為負則讀取所有file.readline()讀取一行(包括"\n"),若返回空表示讀取的文件尾file.readlines()讀取所有行(list(f)也能返回所有行)file.readable()能否讀取文件流file.write(str)將字符串寫入文件,返回的是寫入的字符長度file.writelines(sequence)向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符file.writeable()能否寫文件file.close()關閉文件file.flush()刷新文件內部緩沖,把緩沖區的數據立刻寫入文件file.fileno()返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上file.isatty()如果文件連接到一個終端設備返回 True,否則返回 Falsefile.next()返回文件下一行file.seek(offset[, whence])設置文件當前位置file.tell()返回文件當前位置file.truncate([size])截取文件,截取的字節通過size指定,默認為當前文件位置

文件刪除

刪除文件可以:

  • os.remove()/os.unlink()
  • pathlib.Path.unlink()
    如果傳遞的不是文件,則會拋出OSError異常。

文件復制移動

復制文件:

  • shutil.copy(src, dst):把文件src復制到dst中指定的位置(若dst是文件,則該文件的內容將替換為src的內容;若dst是目錄,則src將被復制到該目錄中);
  • shutil.copy2():會保留文件的詳細信息;

移動文件:

  • os.rename(src, dst):重命名文件;
  • shutil.move(src,dst):將文件移動到指定的位置。

目錄

創建目錄

有多種創建目錄的方法:

方法描述os.mkdir()創建單個子目錄os.makedirs()創建多次目錄,包括中間目錄Pathlib.Path.mkdir()創建單個或多個目錄

os.makedirs(name, mode=0o777, exist_ok=False)
若目錄已存在,則拋出FileExistsError異常;
傳遞exist_ok=True,則目錄存在時,不報錯。

刪除目錄

有以下刪除目錄的函數:

函數描述os.rmdir()刪除一個空目錄pathlib.Path.rmdir()刪除一個空目錄shutil.rmtree()刪除完整的目錄樹,可用於刪除非空目錄

rmdir在目錄不為空,則引發OSError異常。

復制目錄

  • shutil.copytree()復制整個目錄及其子文件、目錄。
  • shutil.move(src,dst):將文件或目錄移動到指定的位置。
  • os.rename(src, dst):重命名文件或目錄;
    • Windows下,若dst存在則拋出FileExistsError異常;
    • Unix下,若src與dst不同時為文件或目錄會拋出IsADirectoryError/NotADirectoryError異常;重命名目錄時,若dst非空,則拋出OSError異常。

枚舉目錄

枚舉目錄列表,可通過:

  • os.scandir():推薦方法;返回一個包含DirEntry迭代器;
  • pathlib.Path()對象的iterdir()方法:返回包含目錄對象的迭代器;
  • os.listdir():遺留方法;返回一個包含子文件(夾)名的列表;
with os.scandir('/tmp') as entries:
for en in entries:
if en.is_file():
print(en.name)

DirEntry屬性與方法:

  • name:文件名
  • path:完整路徑名
  • is_dir():是文件夾,返回True;
  • is_file():是文件,返回True;
  • is_symlink():是symbolic link,返回True;
  • stat():返回文件屬性信息stat_result

遍歷(游走)目錄

os.walk()用於通過在目錄樹中游走輸出目錄中的文件名:
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
參數說明:

  • top:要開始遍歷的頂層目錄;
  • topdown:True,優先遍歷top目錄;False,優先遍歷子目錄;
  • onerror:當walk出錯時,調用的callable函數;
  • followlinks:是否遍歷軟連接;
    返回為一個三元組(root,dirs,files):
  • root:當前正在遍歷的這個文件夾(路徑)
  • dirs:當前目錄下所有目錄名列表;
  • files:當前目錄下所有文件名列表;
for root, dirs, files in os.walk(r"D:\temp"):
print(root, files)
# D:\temp ['add.log', 'out.yml']
# D:\temp\picture ['1.jpeg']
# D:\temp\result\log ['1.log', '2.log']

文件名模式匹配

獲取目錄列表後,要搜索和特定的模式匹配的文件:

函數描述startswith()測試是否以一個特定的模式開始endswith()測試是否以一個特定的模式結束fnmatch.fnmatch(filename, pattern)測試是否匹配(支持*?等通配符)glob.glob()返回一個匹配該模式的文件名列表pathlib.Path.glob()返回一個匹配該模式的生成器對象

fnmatch

nmatch模塊主要用於文件名稱的匹配,比簡單的字符串匹配更強大,但比正則表達式稍弱。

函數名功能filter(names, pattern)對names列表進行過濾,返回匹配的文件子集合fnmatch(filename, pattern)判斷文件名是否和指定pattern匹配fnmatchcase(filename, pattern)和fnmatch()類似,但區分大小寫translate(pattern)將UNIX shell風格的pattern字符串,轉換為正則表達式

fnmatch支持使用如下幾個通配符:

  • *:可匹配0或多個任意字符。
  • ?:可匹配一個任意字符。
  • [字符序列]:可匹配字符序列中的任意字符;支持中畫線表示法,如 [a-c]表示a、b和c字符中任意一個。
  • [!字符序列]:可匹配不在字符序列中的任意字符。
for name in os.listdir('/tmp'):
if fnmatch.fnmatch(name, 'log-*.txt'):
print(name)

glob

glob模塊中的glob()返回所有匹配的文件路徑列表;iglob()與glob基本相同,只是返回的是迭代器(非列表)。
glob.glob(pathname, *, recursive=False)
參數說明:

  • pathname:是要匹配的路徑pattern,可支持通配符* ? []
  • recursive:若為True,則pattern中的**會匹配零或多層目錄及子目錄。

如獲取當前目錄及其子目錄下的所有py文件:

# files = glob.iglob(r"D:\temp\**\*.log", recursive=True)
files = glob.iglob(r"**\*.py", recursive=True)
for f in files:
print(f)
## 返回文件中包含匹配的路徑;
# log的返回為:
# D:\temp\add.log
# D:\temp\result\result.log
# D:\temp\result\log\test2022.log
# py的返回為
# main.py
# files\file_handle.py

臨時文件與目錄

tempfile模塊用於創建臨時文件和目錄(程序停止運行後會自動刪除這些臨時文件),創建位置依次為:

  • Windows下:C:\TEMPC:\TMP,當前目錄;
  • 其他系統:/tmp/var/tmp/usr/tmp,當前目錄;
with tempfile.TemporaryFile('w+t') as fp:
fp.write('Hello world!')
fp.seek(0)
fp.read()
# 此處,文件已被刪除
tmp = ''
with tempfile.TemporaryDirectory() as tmpdir:
print('Created temporary directory ', tmpdir)
tmp = tmpdir
print(os.path.exists(tmpdir))
# 此處,目錄已被刪除

  1. 上一篇文章:
  2. 下一篇文章:
相關文章
    没有相关文章
Copyright © 程式師世界 All Rights Reserved