標籤:python
本篇部落格將介紹Python的檔案處理和相關輸入輸出,將涉及到檔案對象(它的內建函數,內建方法和屬性),標準檔案和檔案系統的存取方法,檔案執行.(歡迎大家去我的新部落格走走)
檔案對象
檔案對象不僅可以用來訪問普通的磁碟檔案,也可以訪問任何其他類型抽象層面上的”檔案”.內建函數open()返回一個檔案對象,對檔案進行後續相關的操作都要用到它.
檔案內建函數(open()和file())
作為鑰匙,內建函數open()和file()提供了初始化輸入/輸出(I/O)操作的通用介面.open()函數成功開啟檔案後會返回一個檔案檔案對象,若不成功,則拋出一個IOError異常.open()函數的文法如下:
file_object = open(file_name, access_mode="r", buffering=-1)
file_name 是將要開啟檔案的檔案名稱,可以是相對路徑或絕對路徑.access_mode也是一個字串,代表開啟檔案的模式,有”r”(代表讀取),”w”(代表寫入),”a”(代表追加).以”r”模式開啟的檔案必須是存在的.以”w”模式開啟檔案,若檔案不存在則會建立,若檔案已存在,則將該檔案清空在寫入資料.”a”模式和”w”類似,唯一的區別就是”a”是在檔案的末尾添加資料的,不會清空檔案原來存在的資料.若檔案不存在,則建立它.access_mode預設為”r”.buffering用於指示訪問檔案所採用的緩衝方式.其中0表示不緩衝,1表示只緩衝一行資料,任何其他大於1的數值代表使用給定值作為緩衝區大小.不提供該參數或給負值代表使用系統預設的緩衝機制.更詳細的看:
檔案內建方法
open()成功執行並返回一個檔案對象之後,所有對該檔案的後續操作都將通過這個控制代碼進行.檔案方法有4類:輸入, 輸出, 檔案內移動及迭代操作.
輸入
read()方法用來直接讀取位元組到字串中,最多讀取給定數目個位元組.如何沒有給定size參數(預設為-1)或者size值為負,檔案將被讀取直到末尾.
readline()方法讀取檔案一行,然後整行(包括行結束符),作為字串返回.和read()方法類似,它也有一個可選的size參數,預設為-1,代表讀到行結束.如果提供了該參數,例如5吧,則它只會讀取該行的5個字元.
readlines()方法不像其他兩個方法返回一個字串.他會讀取所有(剩餘的)行然後把他們他們作為一個字串列表返回.它的選擇性參數sizhint代表返回的最大位元組大小.如果它大於0,那麼返回的所有行應該有sizeint位元組.
輸出
wirte()內建方法的功能與read()和readline()相反.它把含有文本資料或位元據塊的字串寫入到檔案中去.
和 readlines()一樣, writelines()方法是針對列表的操作,它接受一個字串列表作為參數,將他們寫入檔案中.但是行結束符不會自動加入,如果需要,你必須在調用writelines()錢給每行結尾加上行結束符.
檔案內移動
seek()方法(類似與C中的fseek()函數)可以在檔案中移動檔案指標到不同的位置.offset位元組代表相對於某個位置位移量.位置的預設值為0,代表從檔案開頭算起(即絕對位移量),1代表從當前位置算起, 2代表從檔案末尾算起.
tell()方法是對seek()方法的補充;它告訴你當前檔案指標在檔案中的位置–從檔案起始算起,單位為位元組.
檔案迭代
檔案迭代讓程式員訪問檔案是如此簡單:
f = open("test.txt", "r")for eachLine in f: print eachLine
其他
close()通過關閉檔案來結束對它的訪問.
fileno()方法返回開啟檔案的描述符.這是一個整數
調用flush()方法會直接把內部緩衝區中的資料立刻寫入檔案,而不是被動的等待輸出緩衝區被寫入.
是時候大幹一票了
上面扯了這麼多,還是動手實踐直觀些,來寫一些demo
>>> f = open("test", "r")>>> fileno(f)Traceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name ‘fileno‘ is not defined>>> f.fileno()3>>> f.tell()0>>> for eachLine in f:... print eachLine,... This file just for test.line 1line 2@line 3!line 4*end!!!>>> f.tell()65>>> f.seek(0,0)>>> f.tell()0>>>
>>> f = open("newfile", "w")>>> f.write("This is a test")>>> f.tell()14>>> f.writelines(["line1", "line2", "line3"])>>> f.close()>>> f = open("newfile", "r")>>> for eachLine in f:... print eachLine,... This is a testline1line2line3>>>
檔案內建屬性
檔案對象除了方法之外,還有一些資料屬性.這些屬性儲存了檔案對象相關的附加資料.
檔案對象的屬性 |
描述 |
file.closed |
表示檔案以關閉 |
file.encodeing |
檔案所使用的編碼 |
file.mode |
檔案開啟時的訪問模式 |
file.name |
檔案名稱 |
file.newline |
為讀取到行結束符是為None,只有一種行結束符是為一個字串,當檔案有多種行分隔字元時,則為一個包含所有當前所遇到的行結束符的列表 |
標準檔案
標準檔案有這3個:標準輸入, 標準輸出, 標準錯誤
Python中可以通過sys模組來訪問這些檔案的控制代碼.sys.stdin, sys.stdout, sys.error分別代表標準輸入, 標準輸出, 標準錯誤.通常來說,print語句是輸出到sys.stdout, raw_input()是從sys.stdin接收輸入.
命令列參數
相信熟悉C語言的同學對命令列參數比較熟悉,在C語言中,argc和argv分別代表參數個數和參數向量.argv變數代表從一個命令列上輸入的各個參數組成的字串數組;argc變數代表輸入的參數個數.在Python中,argc是不存在的.Pyhton中的sys.argv相當與C的argv,而len(sys.argv)才相當於C中的argc.總之:
- sys.argv 是命令列參數的列表
- len(sys.argv) 是命令列參數的個數
看一個小例子:
##argvTest.pyimport sysprint "you entered", len(sys.argv), "arguments..."print "they were: ", str(sys.argv)
likai@likai:~/python$ python argvTest.py 43 test 44.44 hahayou entered 5 arguments...they were: [‘argvTest.py‘, ‘43‘, ‘test‘, ‘44.44‘, ‘haha‘]
檔案系統
對檔案系統的訪問大多通過Python的os模組實現.該模組是Python訪問作業系統功能的主要介面.os模組實際是只是真正載入的模組的前端,而具體的實現則依賴於具體的作業系統.
os模組可以對進程和進程運行環境進行管理,os模組還負責大部分的檔案系統操作.當然本篇部落客要講os的檔案系統操作..這些操作包括刪除/重新命名檔案,遍曆分類樹,以及管理檔案許可權等.
另一個模組os.path 可以完成一些針對路徑名的操作.它提供的函數可以完成管理和操作檔案路徑名中的各個部分,擷取檔案或子目錄資訊,檔案路徑查詢等功能.
os模組的檔案/目錄訪問函數
函數 |
描述 |
檔案處理 |
|
mkfifo()/mknod() |
建立具名管道/建立檔案節點 |
remove()/unlink() |
刪除檔案 |
rename()/renames() |
重新命名檔案 |
stat() |
返迴文件資訊 |
sysmlink() |
建立符號連結 |
utime() |
更新時間戳記 |
tmpfile() |
建立病開啟(‘w+b’)一個新的臨時檔案 |
walk() |
產生一個分類樹下的所有檔案名稱 |
目錄/檔案夾 |
|
chdir() |
改變當前工作目錄 |
chroot() |
改變當前進程的根目錄 |
getcwd() |
返回當前工作目錄 |
mkdir()/mkdirs() |
建立目錄/多層目錄 |
rmdir()/rmdirs() |
刪除目錄/多層目錄 |
訪問/許可權 |
|
access() |
檢驗許可權 |
chmod() |
改變許可權 |
chown() |
改變owner |
umask() |
設定預設許可權 |
檔案描述符操作 |
|
open() |
底層的作業系統open |
read()/write() |
讀取/寫入資料 |
dup()/dup32() |
複製檔案描述符/功能相同,但是複製到另一個檔案描述符 |
裝置號 |
|
makedev() |
從major和minor裝置號建立一個原始裝置號 |
major()/minor() |
從原始裝置號獲得major/minor裝置號 |
os.path模組中的路徑名訪問函數
函數 |
描述 |
分隔 |
|
basename() |
去掉目錄路徑, 返迴文件名 |
dirname() |
去掉檔案名稱,返回目錄路徑 |
join() |
將分離的各部分組成一個路徑名 |
split() |
返回(dirname(), basename())元組 |
splitdrive() |
返回(dirvename, pathname)元組 |
splitext() |
返回(filenameextension)元組 |
資訊 |
|
getatime() |
返回最近訪問時間 |
getctime() |
返迴文件建立時間 |
getmtime() |
返迴文件修改時間 |
getsize() |
返迴文件大小 |
查詢 |
|
exists() |
指定路徑是否存在 |
isabs() |
指定路徑是否為絕對路徑 |
isdir() |
指定路徑是否存在且為一個目錄 |
isfile() |
指定路徑是否存在且為一個檔案 |
islink() |
指定路徑是否存在且為一個符號連結 |
ismount() |
指定路徑是否存在且為一個掛載點 |
samefile() |
兩個路徑名是否指向同一個檔案 |
end
最後用Python核心編程的一個例子結束本篇部落格
#!/usr/bin/env pythonimport osfor tmpdir in (‘/tmp‘, ‘c:/windows/temp‘): if os.path.isdir(tmpdir): breakelse: print ‘no temp directory available‘ tmpdir = ‘‘if tmpdir: os.chdir(tmpdir) cwd = os.getcwd() print ‘*** current temporary directory‘ print cwd print ‘*** creating example directory...‘ os.mkdir(‘example‘) os.chdir(‘example‘) cwd = os.getcwd() print ‘*** new working directory:‘ print cwd print ‘*** original directory listing:‘ print os.listdir(cwd) print ‘*** creating test file...‘ file = open(‘test‘, ‘w‘) file.write(‘foo\n‘) file.write(‘bar\n‘) file.close() print ‘*** updated directory listing:‘ print os.listdir(cwd) print "*** renaming ‘test‘ to ‘filetest.txt‘" os.rename(‘test‘, ‘filetest.txt‘) print ‘*** updated directory listing:‘ print os.listdir(cwd) path = os.path.join(cwd, os.listdir(cwd)[0]) print ‘*** full file pathname:‘ print path print ‘*** (pathname, basename) == ‘ print os.path.split(path) print ‘*** (filename, extension) == ‘ print os.path.splitext(os.path.basename(path)) print ‘*** displaying file contents:‘ file = open(path) allLines = file.readlines() file.close() for eachLine in allLines: print eachLine, print ‘*** deleting test file‘ os.remove(path) print ‘*** updated directory listing:‘ print os.listdir(cwd) os.chdir(os.pardir) print ‘*** deleting test directory‘ os.rmdir(‘example‘) print ‘*** DONE‘
輸出結果(linux)
likai@likai-Lenovo-G490:~/python$ python ospathex.py *** current temporary directory/tmp*** creating example directory...*** new working directory:/tmp/example*** original directory listing:[]*** creating test file...*** updated directory listing:[‘test‘]*** renaming ‘test‘ to ‘filetest.txt‘*** updated directory listing:[‘filetest.txt‘]*** full file pathname:/tmp/example/filetest.txt*** (pathname, basename) == (‘/tmp/example‘, ‘filetest.txt‘)*** (filename, extension) == (‘filetest‘, ‘.txt‘)*** displaying file contents:foobar*** deleting test file*** updated directory listing:[]*** deleting test directory*** DONE
python學習之路19-檔案IO