Python入門第7/10頁
更新時(shí)間: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包含了諸如把字符串填充到指定的列寬這樣的有用操作,后面會(huì)有提及。
另一種辦法是使用%運(yùn)算符,此運(yùn)算符以一個(gè)字符串為左運(yùn)算元,它按C的sprintf()函數(shù)格式把右運(yùn)算元轉(zhuǎn)換為字符串,返回轉(zhuǎn)換結(jié)果。
問題是:如何把值轉(zhuǎn)換為字符串?
幸運(yùn)的是,Python有一種辦法可以把任何值轉(zhuǎn)換為字符串:使用repr()函數(shù),或把值寫在兩個(gè)反向引號(hào)(``)之間。例如:
>>> 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...
>>> # 反向引號(hào)也適用于非數(shù)值型
... p = [x, y]
>>> ps = repr(p)
>>> ps
'[31.4, 40000]'
>>> # 轉(zhuǎn)換字符串對字符串加字符串引號(hào)和反斜杠
... hello = 'hello, world\n'
>>> hellos = `hello`
>>> print hellos
'hello, world\012'
>>> # 反向引號(hào)內(nèi)可以是一個(gè)序表
... `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é)尾逗號(hào)表示不換行
... 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輸出的各項(xiàng)之間額外加了一個(gè)空格,這是print的規(guī)定?!?nbsp;
此例顯示了函數(shù)string.rjust()的用法,此函數(shù)可以把一個(gè)字符串放進(jìn)指定寬度右對齊,左邊用空格填充。類似函數(shù)還有string.ljust()和string.center()。這些函數(shù)不向外輸出,只是返回轉(zhuǎn)換后的字符串。如果輸入字符串太長也不會(huì)被截?cái)喽潜辉瓨臃祷?。這樣的處理可能會(huì)使你的列對齊失效,但這可能比截?cái)嘁靡恍?,截?cái)嗟慕Y(jié)果是我們看到一個(gè)錯(cuò)誤的值。(如果你確實(shí)需要截?cái)嗟脑捒偪梢栽偌右粚悠瑪啵鐂tring.ljust(x,n)[0:n])。
還有一個(gè)函數(shù)string.zfill(),可以在數(shù)值左邊填零。此函數(shù)可以處理帶有加減號(hào)的情況:
>>> 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.
如果有多個(gè)值可以用一個(gè)序表給出,這時(shí)格式字符串中要有多個(gè)格式,如:
>>> 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ā)例外錯(cuò)誤的話也不會(huì)產(chǎn)生內(nèi)核堆列。Python的%s格式要寬得多:如果相應(yīng)的輸出項(xiàng)不是字符串對象,就先用str()內(nèi)置函數(shù)把它變成字符串。在格式指定中寬度指定為*號(hào)表示后面的輸出項(xiàng)中多出一個(gè)指定寬度的整數(shù)。C格式%n和%p未被支持。
如果你有一個(gè)長格式串不想把它分開,可以在指定格式的地方指定名字,這樣就不需要按次序去把格式和名字對應(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
這里輸出項(xiàng)總是一個(gè)字典,字典的各項(xiàng)值是要輸出的值,字典的鍵值是各值的名字。這種輸出格式經(jīng)常與內(nèi)置函數(shù)var()配合使用,var()返回包含所有局部變量的字典。
7.2 讀寫文件
open()打開一個(gè)文件對象,經(jīng)常使用兩個(gè)參數(shù):“open(文件名,模式)”。例如:
>>> f=open('/tmp/workfile', 'w')
>>> print f
<open file '/tmp/workfile', mode 'w' at 80a0960>
第一自變量是一個(gè)包含了文件名的字符串,第二自變量是文件打開方式的字符串。模式‘r '表示讀取,‘w'表示只寫(已有的同名文件被清除),‘a(chǎn)'表示打開文件在尾部添加, ‘r+'表示打開文件既可以讀也可以寫。打開方式參數(shù)可選,缺省為‘r'模式。
在Windows和Macintosh中在模式中加入‘b'表示以二進(jìn)制格式打開文件,如‘rb'、‘wb '、‘r+b'。Windows對文本文件和二進(jìn)制文件有不同的處理,文本文件中的換行字符在讀寫時(shí)有變化。這種對文件數(shù)據(jù)的幕后的修改不影響ASCII文本文件,但是會(huì)破壞二進(jìn)制數(shù)據(jù)如JPEG 或“.EXE”文件的數(shù)據(jù)。讀寫這樣的文件一定要使用二進(jìn)制格式。(Macintosh中文本模式的精確描述依賴于使用的C庫)。
7.2.1 文件對象的方法
本節(jié)后面的例子假設(shè)已經(jīng)建立了一個(gè)名為f的文件對象。
為了讀取文件內(nèi)容,調(diào)用f.read(size),可以讀入一定字節(jié)數(shù)的數(shù)據(jù)返回為一個(gè)字符串。size 是一個(gè)可選數(shù)值參數(shù),省略size或size取負(fù)值時(shí)讀入整個(gè)文件并返回為一個(gè)字符串;如果文件比你的機(jī)器內(nèi)存大一倍,那是你的問題。指定了正的size的時(shí)候之多讀入并返回size字節(jié)。如果讀到了文件尾,f.read()返回一個(gè)空串("")。如:
>>> f.read()
'This is the entire file.\012'
>>> f.read()
''
f.readline()從文件中讀入一行,返回的字符串中將包括結(jié)尾的一個(gè)換行符(\n),如果文件的最后一行沒有換行符則由該行讀入的字符串也沒有結(jié)尾的換行符。這樣,由readline() 返回的結(jié)果不會(huì)有歧義,讀入結(jié)果為空串時(shí)一定是到了文件尾,讀入一個(gè)'\n'時(shí)為空行。
>>> 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(),返回一個(gè)包含文件所有行的列表。
>>> 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(位移,從哪里)”。讀寫位置按一個(gè)參考點(diǎn)加上位移來計(jì)算,參考點(diǎn)用“從那里”參數(shù)指定,取0時(shí)從文件頭開始算,取1時(shí)按當(dāng)前位置算,取2時(shí)從文件尾算。缺省值是0 ,從文件開始算。
>>> f=open('/tmp/workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5) # 從文件頭前進(jìn)5個(gè)字節(jié),到達(dá)第6個(gè)字符
>>> f.read(1)
'5'
>>> f.seek(-3, 2) # 轉(zhuǎn)到結(jié)尾前3個(gè)字符
>>> f.read(1)
'd'
用外一個(gè)文件后調(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(),參見庫參考手冊。
7.2.2 pickle模塊
字符串可以很容易地從文件讀入或向文件寫出。讀入數(shù)值要麻煩一些,因?yàn)閞ead()方法總是返回字符串,要把讀入的字符串傳給象string.atoi()這樣的函數(shù),把象‘123'這樣的字符串轉(zhuǎn)換為對應(yīng)的整數(shù)值123。但是,當(dāng)你想保存更復(fù)雜的數(shù)據(jù)類型如列表、字典或類實(shí)例時(shí),讀寫就要復(fù)雜得多。
Python的設(shè)計(jì)使程序員可以不必反復(fù)編寫調(diào)試保存復(fù)雜數(shù)據(jù)類型的代碼,它提供了一個(gè)叫做pickle的標(biāo)準(zhǔn)模塊。這個(gè)令人驚異的模塊可以把幾乎任何Python對象轉(zhuǎn)換為字符串表示,這個(gè)過程叫做腌制,從對象的字符串表示恢復(fù)對象叫做恢復(fù)。在腌制和反腌制之間,對象的字符串表示可以保存在文件或數(shù)據(jù)中,甚至于通過網(wǎng)絡(luò)連接傳送到遠(yuǎn)程計(jì)算機(jī)上。
如果你有一個(gè)對象x,有一個(gè)可寫的文件對象f,最簡單的腌制對象的辦法是下面一行代碼:
pickle.dump(x, f)
為了恢復(fù)對象,如果剛才的文件已打開用于讀取,文件對象名仍為f,則:
x = pickle.load(f)
(腌制和恢復(fù)還有其它用法,可以腌制多個(gè)對象,可以不把數(shù)據(jù)寫入文件,詳見庫參考手冊)。
pickle是保存Python對象并被其它程序或同一程序以后再運(yùn)行時(shí)調(diào)用的標(biāo)準(zhǔn)辦法,這種做法的專用術(shù)語叫做“持久對象”。因?yàn)閜ickle使用廣泛,許多Python擴(kuò)展模塊的作者都留意使新增加的數(shù)據(jù)類型如矩陣可以正確地腌制和恢復(fù)。
相關(guān)文章
Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)
本文主要介紹了Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__),詳細(xì)的介紹了這幾種下劃線的用處,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Python 提取dict轉(zhuǎn)換為xml/json/table并輸出的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python 提取dict轉(zhuǎn)換為xml/json/table并輸出的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-08-08python使用pypdf2實(shí)現(xiàn)pdf文檔解密
利用pypdf2完成pdf的解密,這里的事例是python3環(huán)境下的,當(dāng)然python2下也可以運(yùn)行,只需要修改名稱即可,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Python selenium+cookie實(shí)現(xiàn)免密登陸的示例代碼
本文主要介紹了Python selenium+cookie實(shí)現(xiàn)免密登陸的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Tensorflow實(shí)現(xiàn)多GPU并行方式
今天小編就為大家分享一篇Tensorflow實(shí)現(xiàn)多GPU并行方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02