Python程式設計入門(6) (轉)

worldblog發表於2007-12-07
Python程式設計入門(6) (轉)[@more@]

第七章 輸入輸出

有幾種辦法可以從輸出;資料可以用可讀的形式顯示,或儲存到中以備日後使用。本章討論一些輸入輸出的辦法。

7.1 輸出格式控制

到現在為止我們已經看到了兩種輸出值的方法:語句和print語句。(第三種方法是使用檔案的write()方法,標準輸出檔案可以用sys.stdout引用。參見庫參考手冊)。

我們常常需要控制輸出格式,而不僅僅是顯示空格分開的值。有兩種辦法控制輸出格式:一種辦法是自己進行字串處理,用字串的片斷和合並操作可以產生任何可以想象的格式。標準模組string包含了諸如把字串填充到指定的列寬這樣的有用操作,後面會有提及。

另一種辦法是使用%運算子,此運算子以一個字串為左運算元,它按C的sprintf()格式把右運算元轉換為字串,返回轉換結果。

 問題是:如何把值轉換為字串?

幸運的是,有一種辦法可以把任何值轉換為字串:使用repr()函式,或把值寫在兩個反向引號(``)之間。例如:

>>> x = 10 * 3.14 >>> y = 200*200 >>> s = 'The value of x is ' + `x` + ', and y is ' + `y` + '...' >>> print s The value of x is 31.4, and y is 40000... >>> # 反向引號也適用於非數值型 ... p = [x, y] >>> ps = repr(p) >>> ps '[31.4, 40000]' >>> # 轉換字串對字串加字串引號和反斜槓 ... hello = 'hello, worldn' >>> hell= `hello` >>> print hellos 'hello, world12' >>> # 反向引號內可以是一個序表 ... `x, y, ('spam', 'eggs')` "(31.4, 40000, ('spam', 'eggs'))"


下面是兩種寫出平方、立方表的方法:

>>> import string >>> for x in range(1, 11): ... print string.rjust(`x`, 2), string.rjust(`x*x`, 3), ... # 前一行的結尾逗號表示不換行 ... print string.rjust(`x*x*x`, 4) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 >>> for x in range(1,11): ... print'%2d %3d %4d' % (x, x*x, x*x*x) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000


注意print輸出的各項之間額外加了一個空格,這是print的規定。 

此例顯示了函式string.rjust()的用法,此函式可以把一個字串放進指定寬度右對齊,左邊用空格填充。類似函式還有string.ljust()和string.center()。這些函式不向外輸出,只是返回轉換後的字串。如果輸入字串太長也不會被截斷而是被原樣返回。這樣的處理可能會使你的列對齊失效,但這可能比截斷要好一些,截斷的結果是我們看到一個錯誤的值。(如果你確實需要截斷的話總可以再加一層片斷,如string.ljust(x,n)[0:n])。

 還有一個函式string.zfill(),可以在數值左邊填零。此函式可以處理帶有加減號的情況:

>>> string.zfill('12', 5) '00012' >>> string.zfill('-3.14', 7) '-003.14' >>> string.zfill('3.14159265359', 5) '3.14159265359'


%運算子的用法如下例:

>>> import math >>> print 'The value of PI is approximately %5.3f.' % math.pi The value of PI is approximately 3.142.


如果有多個值可以用一個序表給出,這時格式字串中要有多個格式,如:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> for name, phone in table.items(): ... print'%-10s ==> %10d' % (name, phone) ... Jack ==> 4098 Dcab ==> 8637678 Sjoerd ==> 4127


大多數格式與C用法相同,要求要輸出的值的型別符合格式的需要。但是,如果你沒有引發例外錯誤的話也不會產生核心堆列。Python的%s格式要寬得多:如果相應的輸出項不是字串物件,就先用str()內建函式把它變成字串。在格式指定中寬度指定為*號表示後面的輸出項中多出一個指定寬度的整數。C格式%n和%p未被支援。

如果你有一個長格式串不想把它分開,可以在指定格式的地方指定名字,這樣就不需要按次序去把格式和名字對應起來,這種格式為“%(變數名)格式”,例如:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table Jack: 4098; Sjoerd: 4127; Dcab: 8637678


這裡輸出項總是一個字典,字典的各項值是要輸出的值,字典的鍵值是各值的名字。這種輸出格式經常與內建函式var()配合使用,var()返回包含所有區域性變數的字典。

7.2 讀寫檔案

  open()開啟一個檔案物件,經常使用兩個引數:“open(檔名,)”。例如:

>>> f=open('/tmp/workfile', 'w') >>> print f


第一自變數是一個包含了檔名的字串,第二自變數是檔案開啟方式的字串。模式‘r ’表示讀取,‘w’表示只寫(已有的同名檔案被清除),‘a’表示開啟檔案在尾部新增, ‘r+’表示開啟檔案既可以讀也可以寫。開啟方式引數可選,預設為‘r’模式。

在和Macintosh中在模式中加入‘b’表示以二進位制格式開啟檔案,如‘rb’、‘wb ’、‘r+b’。Windows對文字檔案和二進位制檔案有不同的處理,文字檔案中的換行字元在讀寫時有變化。這種對檔案資料的幕後的修改不影響ASCII文字檔案,但是會破壞二進位制資料如JPEG 或“.EXE”檔案的資料。讀寫這樣的檔案一定要使用二進位制格式。(Macintosh中文字模式的精確描述依賴於使用的C庫)。

7.2.1 檔案物件的方法

 本節後面的例子假設已經建立了一個名為f的檔案物件。

為了讀取檔案內容,f.read(size),可以讀入一定位元組數的資料返回為一個字串。size 是一個可選數值引數,省略size或size取負值時讀入整個檔案並返回為一個字串;如果檔案比你的機器大一倍,那是你的問題。指定了正的size的時候之多讀入並返回size位元組。如果讀到了檔案尾,f.read()返回一個空串("")。如:

  >>> f.read() 'This is the entire file.12' >>> f.read() ''  


f.readline()從檔案中讀入一行,返回的字串中將包括結尾的一個換行符(n),如果檔案的最後一行沒有換行符則由該行讀入的字串也沒有結尾的換行符。這樣,由readline() 返回的結果不會有歧義,讀入結果為空串時一定是到了檔案尾,讀入一個'n'時為空行。

>>> f.readline() 'This is the first line of the file.12' >>> f.readline() 'Second line of the file12' >>> f.readline() ''


f.readlines()反覆呼叫f.readline(),返回一個包含檔案所有行的列表。

>>> f.readlines() ['This is the first line of the file.12', 'Second line of the file12']


f.write(string)把string的內容寫入到檔案中,返回None。  >>> f.write('This is a testn')  


f.tell()返回檔案物件的當前讀寫為止,按從檔案開始的位元組數算。為了改變讀寫位置,使用“f.seek(位移,從哪裡)”。讀寫位置按一個參考點加上位移來計算,參考點用“從那裡”引數指定,取0時從檔案頭開始算,取1時按當前位置算,取2時從檔案尾算。預設值是0 ,從檔案開始算。

>>> f=open('/tmp/workfile', 'r+') >>> f.write('0123456789abcdef') >>> f.seek(5) # 從檔案頭前進5個位元組,到達第6個字元 >>> f.read(1) '5' >>> f.seek(-3, 2) # 轉到結尾前3個字元 >>> f.read(1) 'd'


用外一個檔案後呼叫f.close()關閉檔案,釋放開啟檔案所佔用的資源。檔案關閉後再使用此檔案物件就無效了。

>>> f.close() >>> f.read() Traceback (innermost last): File "", line 1, in ? ValueError: I/O operation on closed file


檔案物件還有其它一些不太常用的方法,例如isatty()和truncate(),參見庫參考手冊。 

7.2.2 pickle模組

字串可以很容易地從檔案讀入或向檔案寫出。讀入數值要麻煩一些,因為read()方法總是返回字串,要把讀入的字串傳給象string.atoi()這樣的函式,把象‘123’這樣的字串轉換為對應的整數值123。但是,當你想儲存更復雜的資料型別如列表、字典或類例項時,讀寫就要複雜得多。

Python的設計使程式設計師可以不必反覆編寫儲存複雜資料型別的程式碼,它提供了一個叫做pickle的標準模組。這個令人驚異的模組可以把幾乎任何Python物件轉換為字串表示,這個過程叫做醃製,從物件的字串表示恢復物件叫做恢復。在醃製和反醃製之間,物件的字串表示可以儲存在檔案或資料中,甚至於透過連線傳送到上。

 如果你有一個物件x,有一個可寫的檔案物件f,最簡單的醃製物件的辦法是下面一行程式碼:

pickle.dump(x, f)


為了恢復物件,如果剛才的檔案已開啟用於讀取,檔案物件名仍為f,則:

x = pickle.load(f)


(醃製和恢復還有其它用法,可以醃製多個物件,可以不把資料寫入檔案,詳見庫參考手冊)。

pickle是儲存Python物件並被其它程式或同一程式以後再執行時呼叫的標準辦法,這種做法的專用術語叫做“持久物件”。因為pickle使用廣泛,許多Python擴充套件模組的作者都留意使新增加的資料型別如矩陣可以正確地醃製和恢復。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989396/,如需轉載,請註明出處,否則將追究法律責任。

相關文章