os.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')
屬性操作:
文件類型判斷:
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)
參數說明:
strict
:默認,編解碼出錯時,拋出ValueError
異常;ignore
:忽略編解碼錯誤(可能會丟失數據);replace
:使用替換標識(如’?')替代無效數據;surrogateescape
:使用私有區編碼(U+DC80 to U+DCFF)來替換錯誤字節;在處理未知編碼文件時有效;xmlcharrefreplace
:寫文件有效;錯誤字節被替換為XML字符(&#nnn;
);backslashreplace
:使用Python’s backslashed escape sequences
替換錯誤字節;namereplace
: 寫文件有效;錯誤字節被替換為\N{...}
;打開模式Mode(t:文本;b:二進制):
文件對象的操作函數:
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()
復制文件:
shutil.copy(src, dst)
:把文件src復制到dst中指定的位置(若dst是文件,則該文件的內容將替換為src的內容;若dst是目錄,則src將被復制到該目錄中);shutil.copy2()
:會保留文件的詳細信息;移動文件:
os.rename(src, dst)
:重命名文件;shutil.move(src,dst)
:將文件移動到指定的位置。有多種創建目錄的方法:
os.makedirs(name, mode=0o777, exist_ok=False)
若目錄已存在,則拋出FileExistsError
異常;
傳遞exist_ok=True
,則目錄存在時,不報錯。
有以下刪除目錄的函數:
rmdir在目錄不為空,則引發OSError異常。
shutil.copytree()
復制整個目錄及其子文件、目錄。shutil.move(src,dst)
:將文件或目錄移動到指定的位置。os.rename(src, dst)
:重命名文件或目錄; 枚舉目錄列表,可通過:
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
屬性與方法:
stat_result
;os.walk()用於通過在目錄樹中游走輸出目錄中的文件名:os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
參數說明:
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']
獲取目錄列表後,要搜索和特定的模式匹配的文件:
*
和?
等通配符)glob.glob()返回一個匹配該模式的文件名列表pathlib.Path.glob()返回一個匹配該模式的生成器對象nmatch模塊主要用於文件名稱的匹配,比簡單的字符串匹配更強大,但比正則表達式稍弱。
fnmatch支持使用如下幾個通配符:
*
:可匹配0或多個任意字符。?
:可匹配一個任意字符。[字符序列]
:可匹配字符序列中的任意字符;支持中畫線表示法,如 [a-c]表示a、b和c字符中任意一個。[!字符序列]
:可匹配不在字符序列中的任意字符。for name in os.listdir('/tmp'):
if fnmatch.fnmatch(name, 'log-*.txt'):
print(name)
glob模塊中的glob()返回所有匹配的文件路徑列表;iglob()與glob基本相同,只是返回的是迭代器(非列表)。glob.glob(pathname, *, recursive=False)
參數說明:
* ? []
;**
會匹配零或多層目錄及子目錄。如獲取當前目錄及其子目錄下的所有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模塊用於創建臨時文件和目錄(程序停止運行後會自動刪除這些臨時文件),創建位置依次為:
C:\TEMP
,C:\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))
# 此處,目錄已被刪除