python3基礎:目錄操作
目錄操作
os模組提供了統一的作業系統介面函式,python中對檔案和資料夾的操作都要涉及到os和shutil模組,在使用前需要使用import引入,例如;
import os
import os.path
import shutil
os.getcwd()
獲取當前工作目錄,即當前Python指令碼工作的目錄路徑
>>> import os
>>> os.getcwd()
'F:\\'
os. chdir(path)
改變當前指令碼工作目錄,相當於linux下的cd命令
>>> os.getcwd()
'F:\\py3.6\\PPT'
>>> os.chdir('f:')#錯誤的寫法,不會切換路徑
>>> os.getcwd()
'F:\\py3.6\\PPT'
>>> os.chdir('f:\\')#碟符後面必須寫上\\
>>> os.getcwd()
'F:\\'
>>> os.chdir('f:\\py3.6')#絕對路徑
>>> os.getcwd()
'f:\\py3.6'
>>> os.chdir('test')#相對路徑
>>> os.getcwd()
'f:\\test'
>>>
os.curdir
獲取當前路徑,也就是('.')
>>> os.curdir
'.'
os.pardir
返回當前目錄的父目錄('..')
>>> os.pardir
'..'
>>> os.chdir(os.pardir)
>>> os.getcwd()
'f:\\'
os.name
獲取當前使用的作業系統型別(其中 ‘nt’ 是 windows,’posix’ 是
linux 或者 unix)。
>>> os.name
'nt'
os.mkdir(path [, mode=0777])
建立單級目錄
>>> os.getcwd()
'f:\\'
>>> os.mkdir('20181014')
>>> os.mkdir('20181014')#再次建立拋異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [WinError 183] 當檔案已存在時,無法建立該檔案。: '20181014'
>>>
s.makedirs(path [, mode=0777])
建立多級目錄,父目錄如果不存在,遞迴生成。生成的目錄許可權預設為777.如果重複建立會出錯
>>> os.getcwd()
'f:\\'
>>> os.makedirs('11\\22\\33')
>>> os.makedirs('11\\22\\33')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\kongsh\AppData\Local\Programs\Python\Python36\lib\os.py", line220, in makedirs
mkdir(name, mode)
FileExistsError: [WinError 183] 當檔案已存在時,無法建立該檔案。: '11\\22\\33'
os.removedirs(path)
刪除多級目錄,目錄為空才能刪除,遞迴到上一級為空才能刪除,不為空的話沒有任何影響
os.removedirs('11\\22\\33')
os.rmdir(path)
刪除單級目錄,不為空無法刪除,會報錯
os.listdir(path)
列出指定目錄下的所有檔案和子目錄,包括隱藏檔案或目錄,並以列表形式返回。path不寫的話預設為當前目錄
>>> os.listdir('.')
['$RECYCLE.BIN','20181014' 'a.py', 'AutoTestLog.log', 'b.txt', 'bip32.txt', 'PBKDF.txt', '
pet-shop-tutorial', 'System Volume Information', 'upload_file.exe', '區塊鏈']
>>>
>>> os.listdir()#預設為當前python指令碼目錄
['$RECYCLE.BIN','20181014' 'a.py', 'AutoTestLog.log', 'b.txt', 'bip32.txt', 'PBKDF.txt', '
pet-shop-tutorial', 'System Volume Information', 'upload_file.exe', '區塊鏈']
>>> os.listdir('F:\\20181014')
['11', 'Log.py']
os.remove(filePath)
刪除指定檔案,並且只能刪除檔案
>>> os.chdir(r'F:\20181014')
>>> os.getcwd()
'F:\\20181014'
>>> os.listdir()
['11', 'a.txt', 'Log.py']
>>> os.remove('a.txt')
>>> os.listdir()
['11', 'Log.py']
>>> os.remove('11')#刪除目錄會丟擲PermissionError異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
PermissionError: [WinError 5] 拒絕訪問。: '11'
os.rename(oldname, newname)
重新命名檔案/目錄
>>> os.rename('b.txt','bbb.txt')
>>> os.listdir()
['$RECYCLE.BIN', '20181014', 'a.py', 'AutoTestLog.log', 'bbb.txt', 'bip32.txt',
'PBKDF.txt', 'pet-shop-tutorial', 'System Volume Information', 'upload_file.exe'
, '區塊鏈']
os.stat(path)
獲取檔案資訊,比如檔案大小/建立時間/修改時間等等
>>> os.stat('bbb.txt')
os.stat_result(st_mode=33206, st_ino=1407374883603027, st_dev=2862993929, st
nk=1, st_uid=0, st_gid=0, st_size=9, st_atime=1539497709, st_mtime=153949770
t_ctime=1532852412)
>>> os.stat('bbb.txt').st_mtime #用.來取對應的鍵
1539497709.5655668
os.utime(path[, (atime, mtime)])
修改檔案的時間屬性,設定檔案的access and modified time
>>> os.stat('bbb.txt')
os.stat_result(st_mode=33206, st_ino=1407374883603027, st_dev=2862993929, st
nk=1, st_uid=0, st_gid=0, st_size=9, st_atime=1539497709, st_mtime=153949770
t_ctime=1532852412)
>>> os.utime(r'bbb.txt',(1375448978,1369735977))
>>> os.stat('bbb.txt')
os.stat_result(st_mode=33206, st_ino=1407374883603027, st_dev=2862993929, st
nk=1, st_uid=0, st_gid=0, st_size=9, st_atime=1375448978, st_mtime=136973597
t_ctime=1532852412)
>>> import os .path
>>> os.path.isdir("subprocesstest")
True
>>> os.path.isfile("subprocesstest")
False
os.system (command)
執行shell命令
window下:
>>> os.system('dir')
linux下:
>>> import os
>>> os.system('ls')
os.sep
輸出作業系統的特定的路徑分隔符。 Win下為“\”,Linux下為“/”
>>> os.sep
'\\'
os.linesep
輸出當前平臺使用的行終止符,win 下為“\r\n”,Linux下為“\n”,Mac使用 '\r'。
>>> os.linesep#linux預設是'\n'
'\r\n'
os.pathsep
輸出用於分割檔案路徑的字串。
>>> os.pathsep
';'
os.environ()
獲取系統環境變數,返回的是字典
>>> os.environ['os']#通過指定鍵的方式檢視對應的值
'Windows_NT'
os.poen()
執行一個shell命令開啟一個管道,並且返回一個檔案物件。然後通過操作檔案的方式去操作這個返回值即可
語法:os.popen(command[, mode[, bufsize]])
引數:
command -- 使用的命令。
mode -- 模式許可權可以是 'r'(預設) 或 'w'。
bufsize -- 指明瞭檔案需要的緩衝大小:0意味著無緩衝;1意味著行緩衝;其它正值表示使用引數大小的緩衝(大概值,以位元組為單位)。負的bufsize意味著使用系統的預設值,一般來說,對於tty裝置,它是行緩衝;對於其它檔案,它是全緩衝。如果沒有改引數,使用系統的預設值。
返回值:
返回一個檔案描述符號為fd的開啟的檔案物件
windows:
>>> for i in os.popen('dir'):
... print(i)
...
linnux:
>>> import os
>>> for i in os.popen('ls'):
... print(i)
...
a.py
b.py
os.walk(top, topdown=True, onerror=None, followlinks=False)
引數說明:
➢top:需要遍歷的目錄樹的路徑。
➢topdown的預設值是“True”,表示先返回目錄樹下的檔案,然後遍歷目錄樹下的子目錄。設為False時,表示先遍歷目錄樹下的子目錄,返回子目錄下的檔案,最後返回根目錄下的檔案。
➢onerror的預設值是“None”,表示忽略檔案遍歷時產生的錯誤。如果不為空,則提供一個自定義函式提示錯誤資訊後繼續遍歷或丟擲異常中止遍歷。
➢返回一個列表,列表中的每一個元素都是一個元組,該元組有3個元素,分別表示每次遍歷的路徑名,目錄列表和檔案列表。
➢預設情況下os.walk 不會遍歷軟連結指向的子目錄,若有需要請將followlinks設定為true(軟連線:類似與window的快捷方式)
程式碼示例:遍歷指定資料夾下所有的檔案和目錄
#encoding=utf-8
import os
dir_count=0
file_count=0
for root, dirs, files in os.walk("e:\\testdemo",topdown=False) :
print(u"當前目錄:",root) #列印目錄絕對路徑
for name in files :
print(u'檔名:',os.path.join(root,name) )#列印檔案絕對路徑
file_count+=1
for name in dirs :
print(u'目錄名:',name) #列印目錄絕對路徑
dir_count+=1
print ("目錄個數%s" %dir_count)
print ("檔案個數%s" %file_count)
os.path.abspath(path)
返回規範化的絕對路徑名,根據當前工作目錄路徑連線該檔名後所組成的新的路徑名,但這個路徑不一定是真實存在的路徑。
>>> os.path.abspath('a.txt')
'f:\\a.txt'
os.path.join((a, *p)
連線兩個或更多的路徑名拼接成絕對路徑,中間以“\”分隔,如果所給的引數中都是絕對路徑名,那先給的絕對路徑將會被丟棄。
>>> import os.path
>>> os.path.join("e:\\test","a.txt")
'e:\\test\\a.txt'
>>> os.path.join("test","a.txt")
'test\\a.txt'
>>> os.path.join("e:\\test","e:\\a.txt")
'e:\\a.txt'
>>> os.path.join(r"e:\test",r"e:\a.txt")
'e:\\a.txt'
os.path.split(path)
將path分割成目錄和檔名,如果給的path本身就是目錄的話,也會將最後一個目錄作為檔名而分離,同時它不會判斷檔案或目錄是否存在,以元組返回
>>> os.path.split('f:\\a.txt')
('f:\\', 'a.txt')
>>> os.path.split('f:\\test\\a.txt')
('f:\\test', 'a.txt')
>>> os.path.split('f:\\test')#將目錄作為檔名分割
('f:\\', 'test')
os.path.dirname(path)
返回path的目錄路徑,就是os.path.split(path)的第一個元素。
>>> os.path.dirname('f:\\test\\a.txt')
'f:\\test'
os.path.basename(path)
返回path最後的檔名。如果path以/或\結尾,就會返回空值。即os.path.split(path)的第二個元素
>>> os.path.basename('f:\\test\\a.txt')
'a.txt'
os.path.splitext(path)
分離檔名與副檔名
>>> os.path.splitext('f:\\test\\a.txt')
('f:\\test\\a', '.txt')
os.path.splitdrive(path)
拆分驅動器和檔案路徑,並以元組返回結果;主要針對win有效,Linux元組第一個總是空。
>>> os.path.splitdrive('c:\\a.py')
('c:', '\\a.py')
>>> os.path.splitdrive('a.py')
('', 'a.py')
>>>
os.path.exists(path)
判斷path是否存在,如果存在返回True,否則返回False。比如新建檔案的時候可以使用
>>> os.path.exists('c:\\a.py')
False
>>> os.path.exists('f:\\a.py')
True
os.path.isabs(path)
判斷path是否是絕對路徑,如果是返回True,否則返回False。
>>> os.path.isabs('c:\\aaaaaaaaaa.txt')
True
>>> os.path.isabs('aaaaaaaaaa.txt')
False
os.path.isfile(path)
判斷path是否是檔案,如果是返回True,否則返回False。必須是真實存在的檔案
>>> os.path.isfile(r'd:\gloryroad\a.py')
False
>>> os.path.isfile(r'f:\\a.py')
True
os.path.isdir(path)
判斷path是否是目錄,如果是目錄返回True,否則返回False。必須是真實存在的目錄
>>> os.path.isdir(r"F:\20181014\11")
True
>>> os.path.isdir(r"F:\20181014\22")#目錄不存在
False
>>> os.path.isdir(r"F:\20181014\Log.py")#指定的是檔案
False
os.path.normpath(path)
將path轉換成規範的檔案路徑
>>> os.path.normpath('c:/test/a.py')
'c:\\test\\a.py'
os.path.getsize(name)
獲得檔案大小,如果name是目錄返回結果是0L或者4096L;如果name代表的目錄或檔案不存在,會報WindowsError異常。
>>> os.path.getsize(r'f:\\a.py')
44
>>> os.path.getsize(r'f:')
4096
os.path.getatime(filename)
返回檔案的最後訪問時間,返回的是時間戳。
import os
import time
#獲取檔案最後訪問時間
lastTime = os.path.getatime("test12.py")
print(lastTime)
#將時間戳轉成時間元組
formatTime = time.localtime(lastTime)
print(formatTime)
#格式化時間元組為時間字串
print(time.strftime("%Y-%m-%d %H:%M:%S",formatTime))
os.path.getctime(filename)
以時間戳的形式返回檔案或目錄的建立時間,在Unix系統上是檔案最近更改的時間,在Windows上是檔案或目錄的建立時間。
import os
import time
#獲取檔案建立時間
lastTime = os.path.getctime("test12.py")
print(lastTime)
#將時間戳轉成時間元組
formatTime = time.localtime(lastTime)
print(formatTime)
#格式化時間元組為時間字串
print(time.strftime("%Y-%m-%d %H:%M:%S",formatTime))
os.path.getmtime(filename)
以時間戳的形式返回檔案或目錄的最後存取時間
import os
import time
#獲取檔案建立時間
lastTime = os.path.getmtime("test12.py")
print(lastTime)
#將時間戳轉成時間元組
formatTime = time.localtime(lastTime)
print(formatTime)
#格式化時間元組為時間字串
print(time.strftime("%Y-%m-%d %H:%M:%S",formatTime))
sys模組的命令列引數
sys.argv:互動模式下傳入的命令列引數,第0個是檔名。將自己的程式釋出給別人使用時,無需開啟檔案,直接從命令列引數輸入資料,簡單方便。
以下程式碼需在命令列下執行
程式碼示例1:對命令列輸入的兩個數字求和
#coding=utf-8
import os,time,sys
print(sys.argv)
def add(a,b):
return a+b
if len(sys.argv)!=3:
print('引數數量不對!')
sys.exit()
try:
float(sys.argv[1])
float(sys.argv[2])
except:
print('引數型別不對!請指定兩個數字')
print(add(float(sys.argv[1]),float(sys.argv[2])))
程式碼示例2:對命令列輸入的不同引數進行不同的處理
#coding=utf-8
import os,sys
def readfile(filename):
'''Print a file to the standard output.'''
f = open(filename)
while True:
line = f.readline()
if len(line) == 0:
break
print (line,)
f.close()
if len(sys.argv) ==2 and sys.argv[1].startswith('--'):
pass
elif len(sys.argv) <3:
print ('No action specified.')
sys.exit()
for id,i in enumerate(sys.argv):
print ("第%s個引數:%s" %(id,i))
if sys.argv[1].startswith('--'):
option = sys.argv[1][2:]
# fetch sys.argv[1] but without the first two characters
if option == 'version':
print('Version 1.2')
elif option == 'help':
print('''"
This program prints files to the standard output.
Any number of files can be specified.
Options include:
--version : Prints the version number
--help : Display this help''')
else:
print('Unknown option.')
sys.exit()
else:
for filename in sys.argv[1:]:
readfile(filename)
shutil模組
shutil模組可以方便的移動/複製/刪除目錄及檔案。使用前需要匯入import shutil
複製檔案/資料夾
shutil.copyfile( src, dst) #src複製到dst中去。當然前提是目標地址是具備可寫許可權。丟擲的異常資訊為 IOException. 如果當前的dst已存在的話就會被覆蓋掉 shutil.move( src, dst) #移動檔案或重新命名
shutil.copy( src, dst) 複製一個檔案到一個檔案或一個目錄 shutil.copy("d:\\a.py","d:\\yy.py")
shutil.copy2( src, dst) #在copy上的基礎上再複製檔案最後訪問時間與修改時間也複製過來了,類似於cp –p的東西
shutil.copytree( olddir, newdir, True/Flase)
#把olddir拷貝一份newdir,olddir和newdir都只能是目錄,且newdir 必須不存在。如果第3個引數是True,則複製目錄時將保持資料夾下的符號連線,如果第3個引數是False,則將在複製的目錄下生成物理副本來替代符
移動檔案(目錄)
shutil.move("oldpos","newpos")
shutil.move("d:\\aaa","d:\\ddd")
shutil.copytree( olddir, newdir, True/False) #把olddir拷貝一份newdir,如果第3個引數是True,則複製目錄時將保持資料夾 下的符號連線,如果第3個引數是False,則將在複製的目錄下生成物理副本來 替代符號連線
#shutil.rmtree( src ) 遞迴刪除一個目錄以及目錄內的所有內容,並且刪除後不能恢復