Python(7) 檔案和目錄

2021-07-27 14:10:37 字數 3934 閱讀 9582

檔案和目錄,對於每乙個新手來說,都是乙個難點。

回憶一下c++的檔案和目錄的操作:

引入指定的類,就可以對檔案進行操作。

需要傳入檔案的路徑。

開啟檔案有輸入,輸出,輸入和輸出等許可權可以選擇。

還有個二進位制檔案的模式。

c++對輸入輸出都用了流的概念,將無論輸入輸出到控制台還是檔案或者其他東西都統一起來。

不知道python有沒有這種東西,估計還是有的。其實用多了就習慣了。

主要是接觸少。乙個專案通常都是寫一次就完事了。

先看看**:

a = open(r'e:\test.txt','w')#1

a.write('hello world')#2

a.close()#3

#1開啟檔案,如果沒有的話,就建立乙個,w表示是寫操作開啟。路徑這裡使用了絕對路徑,也可以使用相對路徑

#2對檔案進行寫入操作。

#3關閉檔案。一開始忘記寫()了。但是也沒有報錯。相當於對a定義了乙個close的屬性,但是又沒有初始化。同時也沒有呼叫到close()函式了。沒有關閉到檔案。同時也可以看到寫操作是用了快取,因為我沒有手動重新整理,所以一直沒有儲存,通常關閉檔案的時候,會自動儲存一下的。所以我開始的時候,生成了test.txt,但是沒有任何內容的。

使用相對路徑之後。可以發現生成的檔案是在呼叫這句**的那個檔案的目錄下的。

到目前為止,還是跟c++差不多的,不同之處在於,python似乎自己已經引入了檔案讀寫的模組了。

'a'再文件末尾附加內容

'r'讀文件

讀寫檔案跟c++的差不多,但是對於路徑之類,python就有很多自己的函式了。或者總體思想還是一樣的,只是我不熟悉而已。

路徑:os.path.join()可以將不同的目錄組成乙個路徑。因為不同的作業系統,可能路徑不同。使用這個可以適應不同平台。

os.path.split()可以將路徑分解成不同的目錄。不過這個函式只拆分乙個,需要自己寫遞迴。

>>> a = os.path.join('dir1','dir2','dir3')

>>> a

'dir1\\dir2\\dir3'

>>> b,c = os.path.split(a)

>>> b

'dir1\\dir2'

>>> c

'dir3'

os.path.splitext拆分副檔名

>>> os.path.splitext("***.bat")

('***', '.bat')

os.path.normpath 規範化和清理路徑

>>> os.path.normpath(r"e:\\/..\test.txt")

'e:\\test.txt'

os.path.abspath 將相對路徑轉為絕對路徑。這個只是從當前路徑進行轉換,並沒有判斷檔案是否存在。

>>> os.path.abspath("test.txt")

'e:\\test.txt'

os.path下面所有的路徑操作函式都不檢查正在操作的路徑是否真正存在。除了下面這個:

os.path.exists判斷某個路徑是否實際存在

>>> os.path.exists('test.txt')

true

>>> os.path.exists('***.xx')

false

os.listdir獲取目錄下的內容

>>> os.listdir('e:\\')

['$recycle.bin', 'book', 'boost_1_55_0', 'hello.py', 'system volume information', 'test.txt']

os.path.isfile判斷乙個路徑是否檔案

os.path.isdir判斷乙個路徑是否目錄

>>> os.path.isfile('test.txt')

true

>>> os.path.isfile('ttt')#不存在的是返回false

false

>>> os.path.isdir('book')

true

遞迴整個目錄結構

def printtree(dirpath)

for name in os.listdir(dirpath):

fullpath = os.path.join(dirpath, name)

print(fullpath)

if os.path.isdir(fullpath):

printtree(fullpath)

os.path.getsize 返回檔案大小

>>> os.path.getsize('test.txt')

22

os.path.getmtime 文件最後修改時間,2023年以來的秒數

>>> os.path.getmtime('test.txt')

1488182858.214933

>>> import time

>>> time.ctime(os.path.getmtime('test.txt'))

'mon feb 27 16:07:38 2017'

通過time模組,可以轉換**類的時間

模組shutil包含操作檔案的函式

shutil.move 重新命名乙個檔案

>>> import shutil

>>> shutil.move('test.txt', 'ttt.bat')

'ttt.bat'

>>> shutil.move('ttt.bat','test/ttt.tat')

'test/ttt.tat'

或者直接移動,或者移動的時候順便改名。

另外,如果路徑是不存在的話,是不會建立目錄而是報錯。

改名的還有乙個os.rename函式

複製乙個檔案

>>> shutil.copy("***.txt", "***x.txt")

檔案許可權 os.chmod

它與unix或者linux的系統用的chmod工作方式相同

建立目錄

os.mkdir("e:\\***")#不能中間目錄,如果不存在

os.mkdir("e:\\***\\aaa\bbb\\ccc")#中間的目錄是會建立出來的,如果不存在

刪除目錄

>>> os.rmdir('e:\\***xx')  #這個是不能刪除非空的目錄的

traceback (most recent call last):

file "", line 1, in os.rmdir('e:\\***xx')

oserror: [winerror 145] 目錄不是空的。: 'e:\\***xx'

>>> shutil.rmtree('e:\\***xx')#這個是刪除整個目錄結構,所以很危險的

>>>

通配:

>>> import glob

>>> glob.glob("c:\\p*")

['c:\\pagefile.sys', 'c:\\perflogs', 'c:\\program files', 'c:\\program files (x86)', 'c:\\programdata']

* 0個或任意個字元

? 任意單個字元

[...] 方括號中列出的任意乙個字元

[!...]不在方括號出現的任意乙個字元

其實就是正規表示式,要開始接觸這個東西了。

03 檔案和目錄管理

unit3 browsing the filesystem 1.linux file hierarchy concepts 樹狀架構 表示當前目錄 表示當前使用者的家目錄。2.some important directories 1 the home directories root home 2 ...

4 1 3 檔案目錄

檔案目錄 資料夾 檔案控制塊 目錄表表示檔案下面的檔案 有結構檔案,記錄了實體地址 fcb的集合就是檔案目錄,包含了檔案的基本資訊 檔名和實體地址 檔案目錄 單級目錄檔案 不可以對檔案命名重名 兩級目錄結構 不同使用者可以重名,但不能對檔案分類 多級目錄結構 當前目錄 vs 絕對路徑 樹形結構不便於...

UNIX環境高階程式設計(7) 檔案和目錄(1)

stat fstat lstat函式 本章討論的中心是三個stat函式以及它們返回的資訊 include int stat const char restrict pathname,struct stat restrict buf int fstat int filedes,struct stat ...