python核心編程-文件和輸入輸出

本章將介紹python的文件處理和相關輸入輸出能力。
包括介紹文件對象(它的內建函數、內建方法和屬性)、標準文件、同時討論文件系統的訪問方法、文件執行、最后簡潔介紹持久存儲和標準庫中與文件有關的模塊

內建函數open()和file() 提供了初始化輸入/輸出(I/O)操作的通用接口。
內建函數open()
基本語法:
file_object = open(file_name,access_mode='r',buffering=-1)
file_name是包含要打開的文件名字的字符串,它可以是相對路徑或者絕對路徑。可選變量access_mode也是一個字符串,代表打開文件的模式,默認是讀取模式'r'

一些打開文件的例子:

fp = open('/etc/motd') #以讀的方式打開
fp = open('test', 'w') #以寫的方式打開
fp = open('data', 'r+') #以讀寫方式打開
fp = open(r'c: \io.sys', 'rb') #以二進制讀模式打開

工廠函數file()

open()和file()函數具有相同的功能,可以任意替換。

文件的內建方法

In [1]: f = open('/tmp/test3','r+')
In [2]: f.
f.close       f.fileno      f.name        f.readinto    f.softspace   f.writelines
f.closed      f.flush       f.newlines    f.readline    f.tell        f.xreadlines
f.encoding    f.isatty      f.next        f.readlines   f.truncate    
f.errors      f.mode        f.read        f.seek        f.write     

#輸入
#read()方法用來讀取字節到字符串中,最多讀取給定數目個字節。
#readline()方法讀取打開文件的一行(讀取下個行結束符之前的所有字節)。然后整行,包括行結束,作為字符串返回。
#readlines()會讀取所有(剩余的)行然后把它們作為一個字符串列表返回。它的可選參數sizehit代表返回的最大字節大小
#xreadlines()不是一次性讀取所有行,而是每次讀取一塊,所以用在for循環時可以減小對內存的占用,不過,隨著Python中的迭代器和文件迭代的引入,沒有必要再使用xreadlines(),因為與使用iter(file)和在for循環中文件迭代 for eachLine in file效果是一樣的。

#輸出
#write()方法把含有文本數據或者二進制數據塊的字符串寫入到文件中。
#writelines()方法是針對列表的操作,它接受一個字符串列表作為參數,將它們寫入文件。行結束符并不會被自動加入,必須在調用writelines()前給每行結尾加入上行結束符。

#文件內移動
#seek()方法可以在文件中移動文件指針到不同的位置。offset字節代表相對于某個位置的偏移量。位置的默認值為0,代表從文件的開頭算起(即絕對偏移量),1代表從當前位置算起,2代表從文件末尾算起。

#文件迭代
#一行一行的訪問文件很簡單: 
for eachLine in f
...
#在這個循環里,eachLine代表文本文件中的一行(包括末尾的行結束符)。


#其他
#close() 通過關閉文件來結束對它的訪問。Python垃圾收集機制也會在文件對象的引用計數降至零的時候關閉文件。如果你不顯式地關閉文件,那么你可能丟失輸出緩沖區的數據。
#fileno()方法返回打開文件的描述符。
#flush()方法會直接把內部緩沖區中的數據立即寫入文件,而不是被動地等待輸出緩沖區被寫入。
#isatty()方法是一個布爾內建函數,當文件是一個類tty設備時返回True,否則返回False
#truncate()方法是將文件截取到當前文件指針位置或者到給定size,以字節為單位

  • 有助于開平臺開發的os模塊屬性
os 模塊屬性 描述
linesep 用于在文件中分隔行的字符串
sep 用于分隔文件路徑名的字符串
pathsep 用于分隔文件路徑名的字符串
curdir 當前工作目錄的字符串名稱
pardir (當前工作目錄)父目錄字符串名稱
filename = raw_input('Enter file name: ')
fobj = open(filename,'w')
while True:
    aLine = raw_input('Enter a line('.' to quit): ')
    if aLine != '.':
        fobj.write('%s%s' % (aLine,os.linesep))
    else:
        break
fobj.close()
標準文件

一般來說,只要你的程序一執行,你就可以訪問3個標準文件。它們分別是標準輸入(一般是鍵盤)、標準輸出(到顯示器的緩沖輸出)和標準錯誤(到屏幕的非緩沖輸出),命名分別是stdin stdout stderr
Python中可以通過sys模塊來訪問這些文件的句柄。導入sys模塊之后,就可以使用sys.stdin sys.stdout sys.stderr來訪問。
print語句通常是輸出到sys.stdout 而內建函數 raw_input()則通常從sys.stdin接收輸入

命令行參數

sys模塊通過 sys.argv 屬性提供了對命令行參數的訪問。
argv 變量代表一個從命令行上輸入的各個參數組成的字符串數組;
argc 變量代表輸入的參數個數
在Python中,argc就是sys.argv列表的長度,即len(sys.argv),而該列表的第一項sys.argv[0] 永遠是程序的名稱
總結如下:

  • ** sys.argv 是命令行參數的列表**
  • ** len(sys.argv) 是命令行參數的個數(也就是sys.argc

測試程序:

import sys

print 'you entered', len(sys.argv), 'arguments...'
pring 'they are: ',str(sys.argv)

$argv.py 76 tales 85 hawk
you entered 5 arguments...
they are: ['argv.py','76','tales','85','hawk']

os和os.path模塊的例子(ospathex.py)
#!/usr/bin/env python

import os
for tmpdir in ('/tmp',r'c: \temp'):
    if os.path.isdir(tmpdir):
        break
else:
    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 ...'
    fobj = open('test','w')
    fobj.write('foo\n')
    aline = 'bar'
    fobj.write('%s%s' %(aline,os.linesep))
    fobj.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.splittext(os.path.basename(path))

    print '*** displaying file contents:'
    fobj = open(path)
    for eachLine in fobj:
        print eachLine
    fobj.close()

    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'

文件執行
  • 永久存儲模塊
    pickle模塊
    marshal模塊

文件相關模塊

模塊 內容
base64 提供二進制字符串和文本字符串間的編碼/解碼操作
binascii 提供二進制和ASCII編碼的二進制字符串間的編碼/解碼操作
bz2 訪問BZ2格式的壓縮文件
csv 訪問csv文件(以逗號分隔文件)
filecmp 用于比較目錄和文件
fileinput 提供多個文本文件的行迭代器
getopt/optparse 提供了命令行參數的解析/處理
gzip/zlib 讀寫GNU zip(gzip)文件(壓縮需要zlib 模塊)
shutil 提供高級文件訪問功能
c/StringIO 對字符串對象提供類文件接口
tarfile 讀寫TAR歸檔文件,支持壓縮文件
tempfile 創建臨時文件(名)
uu uu 格式的編碼/解碼
zipfile 用于讀取ZIP歸檔文件的工具
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 一、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,865評論 0 27
  • http://python.jobbole.com/85231/ 關于專業技能寫完項目接著寫寫一名3年工作經驗的J...
    燕京博士閱讀 7,606評論 1 118
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,203評論 2 33
  • 當歲月的黑色素沉積成斑點 一同沉積的還有 曾經飛揚的心 有多久沒有歇斯底里地笑了 當現實的風霜削磨成面具 一起削磨...
    憶如斯閱讀 237評論 0 0
  • 歡迎來到仰心一笑的書房有些話,我想說給你聽有些書,我想讀給你看 我們需要在哪里修行? 我們該用什么態度去工作? 我...
    仰心的人生提案閱讀 495評論 0 0