[PY3]——IO——檔案目錄操作

Jelly_lyj發表於2017-03-18

IO—os、shutil—檔案目錄操作

 

目錄操作

1. 新建

os.mkdir(path[, mode])

相當於mkdir,新建目錄

os.makedirs(path[, mode])

相當於mkdir -p

os.path.exists("/test2")
False

# os.mkdir( ) 如果父路徑不存在,則新建報錯
os.mkdir('/test2/abc')
FileNotFoundError: [Errno 2] No such file or directory: '/test2/abc'

# os.makedirs( ) 會自動建立父目錄,相當於mkdir -p
os.makedirs('/test2/abc')
print(os.path.exists('/test2/abc'))
True

 

2. 刪除

os.rmdir(path)

刪除空目錄

shutil.rmtree(path)

刪除且可以遞迴刪除
os.rmdir("/test2/abc")
OSError: [Errno 39] Directory not empty: '/test2/abc'

 

3. 檢視目錄內容

os.listdir(path)

列出目錄下的內容,相當於ls

# 列出目錄內容但不遞迴子目錄,返回列表
print(os.listdir("/test2/abc"))
['abc2', 'kong.txt']

 

4. 工作目錄的檢視和切換

os.getcwd()

獲取當前所在目錄  相當於pwd

os.chdir(path)

進入指定路徑目錄  相當於cd

print(os.getcwd())
/py3

os.chdir('/test')
print(os.getcwd())
/test

 

5. 重新命名

os.rename(src, dst)

移動/重新命名,相當於mv

print(os.listdir("/test2/aa"))
['aa.sh']
print(os.listdir("/test2/bb"))
[]

os.rename("/test2/aa/aa.sh","/test2/bb/aa.sh.bak")

print(os.listdir("/test2/aa"))
[]
print(os.listdir("/test2/bb"))
['aa.sh.bak']

 

6. 許可權

os.chmod(path, mode)

修改許可權

os.chown(path, uid, gid)

修改屬主屬組

shutil (path,user=None,group=None)

修改屬主屬組

os.lchmod(path, mode)

 

os.lchown(path, uid, gid)

 

# os.chmod
print
(oct(os.stat("/test2/").st_mode)[-4:]) 0755 os.chmod("/test2",0o644) print(oct(os.stat("/test2/").st_mode)[-4:]) 0644
# os.chown print(pwd.getpwuid(os.stat("/test2").st_uid).pw_name) root os.chown("/test2",uname_uid("user00"),gname_gid("user00")) print(pwd.getpwuid(os.stat("/test2").st_uid).pw_name) user00 print(grp.getgrgid(os.stat("/test2").st_gid).gr_name) user00

# shutil.chown(這種方法的uid、gid引數可以接受字串,更方便!)
print(pwd.getpwuid(os.stat("/test2/aa.txt").st_uid).pw_name)
root
shutil.chown("/test2/aa.txt","user00","user00")

print(pwd.getpwuid(os.stat("/test2/aa.txt").st_uid).pw_name)
user00

 

7. 複製和移動 

shutil.copytree 複製整個目錄樹
shutil.move 相當於windows下的Ctrl+X、Ctrl+V
# shutil.move(src,dst,copy_function = copy2 )
print(os.path.exists("/test2/aa"))
True

print(os.listdir("/test2/aa"))
['aa_aa', 'test.txt']

shutil.move("/test2/aa","/test2/bb")

print(os.path.exists("/test2/aa"))
False

print(os.path.exists("/test2/bb"))
True

print(os.listdir("/test2/bb"))
['aa_aa', 'test.txt']

# shutil.copytree(src,dst,symlinks = False,ignore = None,copy_function = copy2,ignore_dangling_symlinks = False )
print(os.path.exists("/test2/bb"))
True

print(os.listdir("/test2/bb"))
['aa_aa', 'test.txt']

shutil.copytree("/test2/bb","/test/bb",ignore=ignore_patterns("*.txt"))

print(os.path.exists("/test/bb"))
True

print(os.listdir("/test/bb"))
['aa_aa']

 

8. 獲取目錄資訊

os.stat(path)

獲取目錄資訊 相當於stat

os.statvfs(path)

獲取指定路徑的檔案系統統計資訊

os.path.getatime(path)

 

os.path.getmtim(path)

 

os.path.getctime(path)

 

os.path.getsize(path)

 
# os.stat輸出的資訊和stat命令一致
print(os.stat("/test2"))
os.stat_result(st_mode=16804, st_ino=296353, st_dev=2053, st_nlink=4, st_uid=500, st_gid=500, st_size=4096, st_atime=1503497751, st_mtime=1503497749, st_ctime=1503497749)

os.system("stat /test2")
 File: `/test2'
 Size: 4096          Blocks: 8          IO Block: 4096   directory
 Device: 805h/2053d    Inode: 296353      Links: 4
 Access: (0644/drw-r--r--)  Uid: (  500/  user00)   Gid: (  500/  user00)
 Access: 2017-08-23 10:15:51.125760987 -0400
 Modify: 2017-08-23 10:15:49.496761986 -0400
 Change: 2017-08-23 10:15:49.496761986 -0400


# os.stat中輸出的每一條資訊都可以通過 . 的方式單獨獲取
print(os.stat("/test2").st_dev)
2053

# 獲取ctime、atime、mtime時間(os.stat的輸出是時間戳的形式所以用datetime)
print(datetime.fromtimestamp(os.stat("/test2/").st_ctime))
2017-08-22 14:51:07.943986

# 獲取uid、gid(os.stat的輸出是gid和uid可以利用pwd和grp轉換為更易讀的username和groupname)
print(pwd.getpwuid(os.stat("/test2").st_uid).pw_name)
user00
print(grp.getgrgid(os.stat("/test2").st_gid).gr_name)
user00


print(os.statvfs("/test2"))
os.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=2396548, f_bfree=1024591, f_bavail=902851, f_files=609600, f_ffree=384157, f_favail=384157, f_flag=4096, f_namemax=255)

f_bsize: 檔案系統塊大小
f_frsize: 分棧大小
f_blocks: 檔案系統資料塊總數
f_bfree: 可用塊數
f_bavail:非超級使用者可獲取的塊數
f_files: 檔案結點總數
f_ffree: 可用檔案結點數
f_favail: 非超級使用者的可用檔案結點數
f_fsid: 檔案系統標識 ID
f_flag: 掛載標記
f_namemax: 最大檔案長度

 

9. 修改

os.utime(path, times)

修改檔案的訪問和修改的時間

 

 

檔案操作

1. 新建

f=open("/test2/newfile.txt",mode="w+")

 

2. 讀寫

(參考《[PY3]——IO——檔案讀寫》

 

3. 刪除

os.remove(path) 刪除檔案
print(os.path.exists("/test2/newfile.txt"))
True

os.remove("/test2/newfile.txt")

print(os.path.exists("/test2/newfile.txt"))
False

 

4. 重新命名

同目錄操作

 

5. 許可權

同目錄操作

 

6. 移動

shutil.copyfile 複製內容,屬主屬組不復制
shutil.copymode  複製許可權
shutil.copystat 複製後設資料
shutil.copy 複製內容和許可權,相當於copyfile+copymode
shutil.copy2 複製內容和後設資料,相當於copyfile+copystat

 

7. 獲取檔案資訊

同目錄操作

 

 

其他操作

1. 判斷

os.path.exists(path) 判斷該路徑是否存在
os.path.isfile(path) 判斷是否是檔案
os.path.isdir(path) 判斷是否是目錄
os.path.ismount(path) 判斷是否是掛載點
os.path.islink(path) 判斷是否是軟連結
os.path.isabs(path) 判斷是否是絕對路徑

 

2. 路徑獲取

os.path.basename(path)  
os.path.dirname(path)  
os.path.relpath(path)  
os.path.split(path) 將path分割成目錄和檔名的二元組返回

 

3. 軟/硬連結

os.link(src,dst)                                      
os.symlink(src,dst)  
os.readlink(path)  

 

參考資料

《shutil模組介紹》

《os.path官方文件》

《shutil官方文件》

《python3-os方法總結》

相關文章