Python入門第7/10頁
更新時間:2007年02月08日 00:00:00 作者:
第七章 輸入輸出
有幾種辦法可以從程序輸出;數(shù)據(jù)可以用可讀的形式顯示,或保存到文件中以備日后使用。本章討論一些輸入輸出的辦法。
7.1 輸出格式控制
到現(xiàn)在為止我們已經(jīng)看到了兩種輸出值的方法:表達(dá)式語句和print語句。(第三種方法是使用文件對象的write()方法,標(biāo)準(zhǔn)輸出文件可以用sys.stdout引用。參見庫參考手冊)。
我們常常需要控制輸出格式,而不僅僅是顯示空格分開的值。有兩種辦法控制輸出格式:一種辦法是自己進(jìn)行字符串處理,用字符串的片斷和合并操作可以產(chǎn)生任何可以想象的格式。標(biāo)準(zhǔ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ù)可以把一個字符串放進(jìn)指定寬度右對齊,左邊用空格填充。類似函數(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'表示以二進(jìn)制格式打開文件,如‘rb'、‘wb '、‘r+b'。Windows對文本文件和二進(jìn)制文件有不同的處理,文本文件中的換行字符在讀寫時有變化。這種對文件數(shù)據(jù)的幕后的修改不影響ASCII文本文件,但是會破壞二進(jìn)制數(shù)據(jù)如JPEG 或“.EXE”文件的數(shù)據(jù)。讀寫這樣的文件一定要使用二進(jìn)制格式。(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取負(fù)值時讀入整個文件并返回為一個字符串;如果文件比你的機(jī)器內(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()反復(fù)調(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()返回文件對象的當(dāng)前讀寫為止,按從文件開始的字節(jié)數(shù)算。為了改變讀寫位置,使用“f.seek(位移,從哪里)”。讀寫位置按一個參考點加上位移來計算,參考點用“從那里”參數(shù)指定,取0時從文件頭開始算,取1時按當(dāng)前位置算,取2時從文件尾算。缺省值是0 ,從文件開始算。
>>> f=open('/tmp/workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5) # 從文件頭前進(jìn)5個字節(jié),到達(dá)第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。但是,當(dāng)你想保存更復(fù)雜的數(shù)據(jù)類型如列表、字典或類實例時,讀寫就要復(fù)雜得多。
Python的設(shè)計使程序員可以不必反復(fù)編寫調(diào)試保存復(fù)雜數(shù)據(jù)類型的代碼,它提供了一個叫做pickle的標(biāo)準(zhǔn)模塊。這個令人驚異的模塊可以把幾乎任何Python對象轉(zhuǎn)換為字符串表示,這個過程叫做腌制,從對象的字符串表示恢復(fù)對象叫做恢復(fù)。在腌制和反腌制之間,對象的字符串表示可以保存在文件或數(shù)據(jù)中,甚至于通過網(wǎng)絡(luò)連接傳送到遠(yuǎn)程計算機(jī)上。
如果你有一個對象x,有一個可寫的文件對象f,最簡單的腌制對象的辦法是下面一行代碼:
pickle.dump(x, f)
為了恢復(fù)對象,如果剛才的文件已打開用于讀取,文件對象名仍為f,則:
x = pickle.load(f)
(腌制和恢復(fù)還有其它用法,可以腌制多個對象,可以不把數(shù)據(jù)寫入文件,詳見庫參考手冊)。
pickle是保存Python對象并被其它程序或同一程序以后再運行時調(diào)用的標(biāo)準(zhǔn)辦法,這種做法的專用術(shù)語叫做“持久對象”。因為pickle使用廣泛,許多Python擴(kuò)展模塊的作者都留意使新增加的數(shù)據(jù)類型如矩陣可以正確地腌制和恢復(fù)。
相關(guān)文章
Python利用Rasa框架和SMTPlib庫實現(xiàn)郵件回復(fù)助手
在現(xiàn)代辦公場景中,處理大量郵件是一項既耗時又容易出錯的任務(wù),本文將詳細(xì)介紹如何使用Python的Rasa框架和SMTPlib庫建一個智能的郵件自動回復(fù)助手,感興趣的可以了解下2025-04-04
通過數(shù)據(jù)庫向Django模型添加字段的示例
這篇文章主要介紹了通過數(shù)據(jù)庫向Django模型添加字段的示例,Django是人氣最高的Python web開發(fā)框架,需要的朋友可以參考下2015-07-07
python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例
今天小編就為大家分享一篇python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
python安裝numpy&安裝matplotlib& scipy的教程
下面小編就為大家?guī)硪黄猵ython安裝numpy&安裝matplotlib& scipy的教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
python實現(xiàn)DEM數(shù)據(jù)的陰影生成的方法
這篇文章主要介紹了python實現(xiàn)DEM數(shù)據(jù)的陰影生成的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Jupyter notebook 更改文件打開的默認(rèn)路徑操作
這篇文章主要介紹了Jupyter notebook 更改文件打開的默認(rèn)路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Python之Matplotlib繪圖調(diào)節(jié)清晰度解決方案
Matplotlib是一個Python的繪圖庫,可以用來繪制各種類型的圖表,包括線圖、散點圖、柱狀圖等等,這篇文章主要給大家介紹了關(guān)于Python之Matplotlib繪圖調(diào)節(jié)清晰度的相關(guān)資料,需要的朋友可以參考下2024-03-03

