最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python入門第7/10頁

 更新時間:2007年02月08日 00:00:00   作者:  

第七章 輸入輸出
有幾種辦法可以從程序輸出;數(shù)據(jù)可以用可讀的形式顯示,或保存到文件中以備日后使用。本章討論一些輸入輸出的辦法。

7.1 輸出格式控制
到現(xiàn)在為止我們已經(jīng)看到了兩種輸出值的方法:表達式語句和print語句。(第三種方法是使用文件對象的write()方法,標準輸出文件可以用sys.stdout引用。參見庫參考手冊)。

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

另一種辦法是使用%運算符,此運算符以一個字符串為左運算元,它按C的sprintf()函數(shù)格式把右運算元轉(zhuǎn)換為字符串,返回轉(zhuǎn)換結(jié)果。

 問題是:如何把值轉(zhuǎn)換為字符串? 

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

>>> 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...
>>> # 反向引號也適用于非數(shù)值型
... p = [x, y]
>>> ps = repr(p)
>>> ps
'[31.4, 40000]'
>>> # 轉(zhuǎn)換字符串對字符串加字符串引號和反斜杠
... hello = 'hello, world\n'
>>> hellos = `hello`
>>> print hellos
'hello, world\012'
>>> # 反向引號內(nèi)可以是一個序表
... `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),
...     # 前一行的結(jié)尾逗號表示不換行
...     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的規(guī)定?!?nbsp;

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

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

>>> 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


大多數(shù)格式與C用法相同,要求要輸出的值的類型符合格式的需要。但是,如果你沒有引發(fā)例外錯誤的話也不會產(chǎn)生內(nèi)核堆列。Python的%s格式要寬得多:如果相應(yīng)的輸出項不是字符串對象,就先用str()內(nèi)置函數(shù)把它變成字符串。在格式指定中寬度指定為*號表示后面的輸出項中多出一個指定寬度的整數(shù)。C格式%n和%p未被支持。

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

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


這里輸出項總是一個字典,字典的各項值是要輸出的值,字典的鍵值是各值的名字。這種輸出格式經(jīng)常與內(nèi)置函數(shù)var()配合使用,var()返回包含所有局部變量的字典。

7.2 讀寫文件
  open()打開一個文件對象,經(jīng)常使用兩個參數(shù):“open(文件名,模式)”。例如: 

>>> f=open('/tmp/workfile', 'w')
>>> print f
<open file '/tmp/workfile', mode 'w' at 80a0960>


第一自變量是一個包含了文件名的字符串,第二自變量是文件打開方式的字符串。模式‘r '表示讀取,‘w'表示只寫(已有的同名文件被清除),‘a(chǎn)'表示打開文件在尾部添加, ‘r+'表示打開文件既可以讀也可以寫。打開方式參數(shù)可選,缺省為‘r'模式。

在Windows和Macintosh中在模式中加入‘b'表示以二進制格式打開文件,如‘rb'、‘wb '、‘r+b'。Windows對文本文件和二進制文件有不同的處理,文本文件中的換行字符在讀寫時有變化。這種對文件數(shù)據(jù)的幕后的修改不影響ASCII文本文件,但是會破壞二進制數(shù)據(jù)如JPEG 或“.EXE”文件的數(shù)據(jù)。讀寫這樣的文件一定要使用二進制格式。(Macintosh中文本模式的精確描述依賴于使用的C庫)。

7.2.1 文件對象的方法
 本節(jié)后面的例子假設(shè)已經(jīng)建立了一個名為f的文件對象。 

為了讀取文件內(nèi)容,調(diào)用f.read(size),可以讀入一定字節(jié)數(shù)的數(shù)據(jù)返回為一個字符串。size 是一個可選數(shù)值參數(shù),省略size或size取負值時讀入整個文件并返回為一個字符串;如果文件比你的機器內(nèi)存大一倍,那是你的問題。指定了正的size的時候之多讀入并返回size字節(jié)。如果讀到了文件尾,f.read()返回一個空串("")。如:

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


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

>>> f.readline()
'This is the first line of the file.\012'
>>> f.readline()
'Second line of the file\012'
>>> f.readline()
''


f.readlines()反復調(diào)用f.readline(),返回一個包含文件所有行的列表。

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


f.write(string)把string的內(nèi)容寫入到文件中,返回None。
 
>>> f.write('This is a test\n')
 


f.tell()返回文件對象的當前讀寫為止,按從文件開始的字節(jié)數(shù)算。為了改變讀寫位置,使用“f.seek(位移,從哪里)”。讀寫位置按一個參考點加上位移來計算,參考點用“從那里”參數(shù)指定,取0時從文件頭開始算,取1時按當前位置算,取2時從文件尾算。缺省值是0 ,從文件開始算。

>>> f=open('/tmp/workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5)     # 從文件頭前進5個字節(jié),到達第6個字符
>>> f.read(1)        
'5'
>>> f.seek(-3, 2) # 轉(zhuǎn)到結(jié)尾前3個字符
>>> f.read(1)
'd'


用外一個文件后調(diào)用f.close()關(guān)閉文件,釋放打開文件所占用的系統(tǒng)資源。文件關(guān)閉后再使用此文件對象就無效了。

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


文件對象還有其它一些不太常用的方法,例如isatty()和truncate(),參見庫參考手冊?!?nbsp;

7.2.2 pickle模塊
字符串可以很容易地從文件讀入或向文件寫出。讀入數(shù)值要麻煩一些,因為read()方法總是返回字符串,要把讀入的字符串傳給象string.atoi()這樣的函數(shù),把象‘123'這樣的字符串轉(zhuǎn)換為對應(yīng)的整數(shù)值123。但是,當你想保存更復雜的數(shù)據(jù)類型如列表、字典或類實例時,讀寫就要復雜得多。

Python的設(shè)計使程序員可以不必反復編寫調(diào)試保存復雜數(shù)據(jù)類型的代碼,它提供了一個叫做pickle的標準模塊。這個令人驚異的模塊可以把幾乎任何Python對象轉(zhuǎn)換為字符串表示,這個過程叫做腌制,從對象的字符串表示恢復對象叫做恢復。在腌制和反腌制之間,對象的字符串表示可以保存在文件或數(shù)據(jù)中,甚至于通過網(wǎng)絡(luò)連接傳送到遠程計算機上。

 如果你有一個對象x,有一個可寫的文件對象f,最簡單的腌制對象的辦法是下面一行代碼: 

pickle.dump(x, f)

為了恢復對象,如果剛才的文件已打開用于讀取,文件對象名仍為f,則:

x = pickle.load(f)

(腌制和恢復還有其它用法,可以腌制多個對象,可以不把數(shù)據(jù)寫入文件,詳見庫參考手冊)。 

pickle是保存Python對象并被其它程序或同一程序以后再運行時調(diào)用的標準辦法,這種做法的專用術(shù)語叫做“持久對象”。因為pickle使用廣泛,許多Python擴展模塊的作者都留意使新增加的數(shù)據(jù)類型如矩陣可以正確地腌制和恢復。

相關(guān)文章

最新評論

樟树市| 广河县| 马山县| 商南县| 阿城市| 论坛| 隆昌县| 陕西省| 军事| 芒康县| 盐源县| 双柏县| 云梦县| 无极县| 普定县| 明溪县| 安宁市| 穆棱市| 泸溪县| 仁布县| 晋州市| 成安县| 亳州市| 红安县| 通道| 彩票| 大洼县| 庆云县| 海伦市| 亳州市| 突泉县| 霍州市| 无为县| 永嘉县| 吐鲁番市| 米林县| 淅川县| 长宁县| 扶风县| 宜昌市| 延吉市|