python123第七章_Python入门第7/10页
Python入門第7/10頁
更新時間:2007年02月08日 00:00:00 ? 作者:
第七章?輸入輸出
有幾種辦法可以從程序輸出;數據可以用可讀的形式顯示,或保存到文件中以備日后使用。本章討論一些輸入輸出的辦法。
7.1?輸出格式控制
到現在為止我們已經看到了兩種輸出值的方法:表達式語句和print語句。(第三種方法是使用文件對象的write()方法,標準輸出文件可以用sys.stdout引用。參見庫參考手冊)。
我們常常需要控制輸出格式,而不僅僅是顯示空格分開的值。有兩種辦法控制輸出格式:一種辦法是自己進行字符串處理,用字符串的片斷和合并操作可以產生任何可以想象的格式。標準模塊string包含了諸如把字符串填充到指定的列寬這樣的有用操作,后面會有提及。
另一種辦法是使用%運算符,此運算符以一個字符串為左運算元,它按C的sprintf()函數格式把右運算元轉換為字符串,返回轉換結果。
問題是:如何把值轉換為字符串?
幸運的是,Python有一種辦法可以把任何值轉換為字符串:使用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,?world\n'
>>>?hellos?=?`hello`
>>>?print?hellos
'hello,?world\012'
>>>?#?反向引號內可以是一個序表
...?`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'模式。
在Windows和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.\012'
>>>?f.read()
''
f.readline()從文件中讀入一行,返回的字符串中將包括結尾的一個換行符(\n),如果文件的最后一行沒有換行符則由該行讀入的字符串也沒有結尾的換行符。這樣,由readline()?返回的結果不會有歧義,讀入結果為空串時一定是到了文件尾,讀入一個'\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.readline(),返回一個包含文件所有行的列表。
>>>?f.readlines()
['This?is?the?first?line?of?the?file.\012',?'Second?line?of?the?file\012']
f.write(string)把string的內容寫入到文件中,返回None。
>>>?f.write('This?is?a?test\n')
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擴展模塊的作者都留意使新增加的數據類型如矩陣可以正確地腌制和恢復。
相關文章
今天小編就為大家分享一篇在IPython中執行Python程序文件的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
這篇文章主要介紹了python格式化字符串的方法,實例展示了常見的幾類Python針對字符串的格式方法,非常實用,需要的朋友可以參考下2014-09-09
這篇文章主要介紹了使用pygame實現垃圾分類小游戲功能(已獲校級二等獎),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
今天小編就為大家分享一篇TensorFlow內存管理bfc算法實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
這篇文章主要介紹了Python heapq使用詳解及實例代碼的相關資料,需要的朋友可以參考下2017-01-01
今天小編就為大家分享一篇python實現對列表中的元素進行倒序打印,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
這篇文章主要介紹了Django admin管理工具TabularInline類用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
今天小編就為大家分享一篇python畫柱狀圖--不同顏色并顯示數值的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
這篇文章主要介紹了django 快速啟動數據庫客戶端程序的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
這篇文章主要介紹了python動態性強類型用法,對比C#實例分析了python動態性強類型的使用方法,需要的朋友可以參考下2015-05-05
最新評論
總結
以上是生活随笔為你收集整理的python123第七章_Python入门第7/10页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是packages文件夹?win10
- 下一篇: dart和python哪个好_RedMo