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) |