python學習之路19-檔案IO

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.