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

本章將介紹python的文件處理和相關(guān)輸入輸出能力趁俊。
包括介紹文件對象(它的內(nèi)建函數(shù)脚作、內(nèi)建方法和屬性)警没、標(biāo)準(zhǔn)文件匈辱、同時討論文件系統(tǒng)的訪問方法、文件執(zhí)行杀迹、最后簡潔介紹持久存儲和標(biāo)準(zhǔn)庫中與文件有關(guān)的模塊

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

一些打開文件的例子:

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

工廠函數(shù)file()

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

文件的內(nèi)建方法

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()方法用來讀取字節(jié)到字符串中绵载,最多讀取給定數(shù)目個字節(jié)埂陆。
#readline()方法讀取打開文件的一行(讀取下個行結(jié)束符之前的所有字節(jié))。然后整行娃豹,包括行結(jié)束焚虱,作為字符串返回。
#readlines()會讀取所有(剩余的)行然后把它們作為一個字符串列表返回懂版。它的可選參數(shù)sizehit代表返回的最大字節(jié)大小
#xreadlines()不是一次性讀取所有行鹃栽,而是每次讀取一塊,所以用在for循環(huán)時可以減小對內(nèi)存的占用躯畴,不過民鼓,隨著Python中的迭代器和文件迭代的引入薇芝,沒有必要再使用xreadlines(),因為與使用iter(file)和在for循環(huán)中文件迭代 for eachLine in file效果是一樣的丰嘉。

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

#文件內(nèi)移動
#seek()方法可以在文件中移動文件指針到不同的位置荐开。offset字節(jié)代表相對于某個位置的偏移量。位置的默認(rèn)值為0简肴,代表從文件的開頭算起(即絕對偏移量)晃听,1代表從當(dāng)前位置算起,2代表從文件末尾算起着帽。

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


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

  • 有助于開平臺開發(fā)的os模塊屬性
os 模塊屬性 描述
linesep 用于在文件中分隔行的字符串
sep 用于分隔文件路徑名的字符串
pathsep 用于分隔文件路徑名的字符串
curdir 當(dāng)前工作目錄的字符串名稱
pardir (當(dāng)前工作目錄)父目錄字符串名稱
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()
標(biāo)準(zhǔn)文件

一般來說,只要你的程序一執(zhí)行三圆,你就可以訪問3個標(biāo)準(zhǔn)文件狞换。它們分別是標(biāo)準(zhǔn)輸入(一般是鍵盤)、標(biāo)準(zhǔn)輸出(到顯示器的緩沖輸出)和標(biāo)準(zhǔn)錯誤(到屏幕的非緩沖輸出)舟肉,命名分別是stdin stdout stderr修噪。
Python中可以通過sys模塊來訪問這些文件的句柄。導(dǎo)入sys模塊之后路媚,就可以使用sys.stdin sys.stdout sys.stderr來訪問黄琼。
print語句通常是輸出到sys.stdout 而內(nèi)建函數(shù) raw_input()則通常從sys.stdin接收輸入

命令行參數(shù)

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

  • ** sys.argv 是命令行參數(shù)的列表**
  • ** len(sys.argv) 是命令行參數(shù)的個數(shù)(也就是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'

文件執(zhí)行
  • 永久存儲模塊
    pickle模塊
    marshal模塊

文件相關(guān)模塊

模塊 內(nèi)容
base64 提供二進(jìn)制字符串和文本字符串間的編碼/解碼操作
binascii 提供二進(jìn)制和ASCII編碼的二進(jìn)制字符串間的編碼/解碼操作
bz2 訪問BZ2格式的壓縮文件
csv 訪問csv文件(以逗號分隔文件)
filecmp 用于比較目錄和文件
fileinput 提供多個文本文件的行迭代器
getopt/optparse 提供了命令行參數(shù)的解析/處理
gzip/zlib 讀寫GNU zip(gzip)文件(壓縮需要zlib 模塊)
shutil 提供高級文件訪問功能
c/StringIO 對字符串對象提供類文件接口
tarfile 讀寫TAR歸檔文件,支持壓縮文件
tempfile 創(chuàng)建臨時文件(名)
uu uu 格式的編碼/解碼
zipfile 用于讀取ZIP歸檔文件的工具
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弛矛,一起剝皮案震驚了整個濱河市够吩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丈氓,老刑警劉巖周循,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異万俗,居然都是意外死亡湾笛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門闰歪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎研,“玉大人,你說我怎么就攤上這事库倘×侔纾” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵教翩,是天一觀的道長杆勇。 經(jīng)常有香客問我,道長饱亿,這世上最難降的妖魔是什么蚜退? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮彪笼,結(jié)果婚禮上钻注,老公的妹妹穿的比我還像新娘。我一直安慰自己配猫,他們只是感情好幅恋,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泵肄,像睡著了一般佳遣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凡伊,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天零渐,我揣著相機(jī)與錄音,去河邊找鬼系忙。 笑死诵盼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播风宁,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼洁墙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戒财?” 一聲冷哼從身側(cè)響起热监,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮寞,沒想到半個月后孝扛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡幽崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年苦始,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慌申。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡陌选,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹄溉,到底是詐尸還是另有隱情咨油,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布柒爵,位于F島的核電站役电,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏餐弱。R本人自食惡果不足惜宴霸,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一囱晴、第九天 我趴在偏房一處隱蔽的房頂上張望膏蚓。 院中可真熱鬧,春花似錦畸写、人聲如沸驮瞧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽论笔。三九已至,卻和暖如春千所,著一層夾襖步出監(jiān)牢的瞬間狂魔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工淫痰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留最楷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像籽孙,于是被迫代替她去往敵國和親烈评。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

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