?? 7.html
字號:
<HTML><!-- Mirrored from www.math.pku.edu.cn/teachers/lidf/docs/Python/7.html by HTTrack Website Copier/3.x [XR&CO'2005], Fri, 08 Jul 2005 11:49:14 GMT --><HEAD><TITLE>第七章 輸入輸出</TITLE></HEAD><BODY><H1>第七章 輸入輸出</H1><P>有幾種辦法可以從程序輸出;數據可以用可讀的形式顯示,或保存到文件中以備日后使用。本章討論一些輸入輸出的辦法。</P><H2>7.1 輸出格式控制</H2><P>到現在為止我們已經看到了兩種輸出值的方法:表達式語句和print語句。(第三種方法是使用文件對象的write()方法,標準輸出文件可以用sys.stdout引用。參見庫參考手冊)。</P><P>我們常常需要控制輸出格式,而不僅僅是顯示空格分開的值。有兩種辦法控制輸出格式:一種辦法是自己進行字符串處理,用字符串的片斷和合并操作可以產生任何可以想象的格式。標準模塊string包含了諸如把字符串填充到指定的列寬這樣的有用操作,后面會有提及。</P><P>另一種辦法是使用%運算符,此運算符以一個字符串為左運算元,它按C的sprintf()函數格式把右運算元轉換為字符串,返回轉換結果。</P><P> 問題是:如何把值轉換為字符串?<P>幸運的是,Python有一種辦法可以把任何值轉換為字符串:使用repr()函數,或把值寫在兩個反向引號(``)之間。例如:</P><PRE>>>> x = 10 * 3.14>>> y = 200*200>>> s = 'The value of x is ' + `x` + ', and y is ' + `y` + '...'>>> print sThe 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'))"</PRE><P>下面是兩種寫出平方、立方表的方法:</P><PRE>>>> 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 72910 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 72910 100 1000</PRE><P>注意print輸出的各項之間額外加了一個空格,這是print的規定。 <P>此例顯示了函數string.rjust()的用法,此函數可以把一個字符串放進指定寬度右對齊,左邊用空格填充。類似函數還有string.ljust()和string.center()。這些函數不向外輸出,只是返回轉換后的字符串。如果輸入字符串太長也不會被截斷而是被原樣返回。這樣的處理可能會使你的列對齊失效,但這可能比截斷要好一些,截斷的結果是我們看到一個錯誤的值。(如果你確實需要截斷的話總可以再加一層片斷,如string.ljust(x,n)[0:n])。</P><P> 還有一個函數string.zfill(),可以在數值左邊填零。此函數可以處理帶有加減號的情況:<PRE>>>> string.zfill('12', 5)'00012'>>> string.zfill('-3.14', 7)'-003.14'>>> string.zfill('3.14159265359', 5)'3.14159265359'</PRE><P>%操作符的用法如下例:</P><PRE>>>> import math>>> print 'The value of PI is approximately %5.3f.' % math.piThe value of PI is approximately 3.142.</PRE><P>如果有多個值可以用一個序表給出,這時格式字符串中要有多個格式,如:</P><PRE>>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}>>> for name, phone in table.items():... print'%-10s ==> %10d' % (name, phone)... Jack ==> 4098Dcab ==> 8637678Sjoerd ==> 4127</PRE><P>大多數格式與C用法相同,要求要輸出的值的類型符合格式的需要。但是,如果你沒有引發例外錯誤的話也不會產生內核堆列。Python的%s格式要寬得多:如果相應的輸出項不是字符串對象,就先用str()內置函數把它變成字符串。在格式指定中寬度指定為*號表示后面的輸出項中多出一個指定寬度的整數。C格式%n和%p未被支持。</P><P>如果你有一個長格式串不想把它分開,可以在指定格式的地方指定名字,這樣就不需要按次序去把格式和名字對應起來,這種格式為“%(變量名)格式”,例如:</P><PRE>>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}>>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % tableJack: 4098; Sjoerd: 4127; Dcab: 8637678</PRE><P>這里輸出項總是一個字典,字典的各項值是要輸出的值,字典的鍵值是各值的名字。這種輸出格式經常與內置函數var()配合使用,var()返回包含所有局部變量的字典。</P><H2>7.2 讀寫文件</H2><P> open()打開一個文件對象,經常使用兩個參數:“open(文件名,模式)”。例如:<PRE>>>> f=open('/tmp/workfile', 'w')>>> print f<open file '/tmp/workfile', mode 'w' at 80a0960></PRE><P>第一自變量是一個包含了文件名的字符串,第二自變量是文件打開方式的字符串。模式‘r’表示讀取,‘w’表示只寫(已有的同名文件被清除),‘a’表示打開文件在尾部添加,‘r+’表示打開文件既可以讀也可以寫。打開方式參數可選,缺省為‘r’模式。</P><P>在Windows和Macintosh中在模式中加入‘b’表示以二進制格式打開文件,如‘rb’、‘wb’、‘r+b’。Windows對文本文件和二進制文件有不同的處理,文本文件中的換行字符在讀寫時有變化。這種對文件數據的幕后的修改不影響ASCII文本文件,但是會破壞二進制數據如JPEG或“.EXE”文件的數據。讀寫這樣的文件一定要使用二進制格式。(Macintosh中文本模式的精確描述依賴于使用的C庫)。</P><H3>7.2.1 文件對象的方法</H3><P> 本節后面的例子假設已經建立了一個名為f的文件對象。<P>為了讀取文件內容,調用f.read(size),可以讀入一定字節數的數據返回為一個字符串。size是一個可選數值參數,省略size或size取負值時讀入整個文件并返回為一個字符串;如果文件比你的機器內存大一倍,那是你的問題。指定了正的size的時候之多讀入并返回size字節。如果讀到了文件尾,f.read()返回一個空串("")。如:</P><PRE> >>> f.read()'This is the entire file.\012'>>> f.read()'' </PRE><P>f.readline()從文件中讀入一行,返回的字符串中將包括結尾的一個換行符(\n),如果文件的最后一行沒有換行符則由該行讀入的字符串也沒有結尾的換行符。這樣,由readline()返回的結果不會有歧義,讀入結果為空串時一定是到了文件尾,讀入一個'\n'時為空行。</P><PRE>>>> f.readline()'This is the first line of the file.\012'>>> f.readline()'Second line of the file\012'>>> f.readline()''</PRE><P>f.readlines()反復調用f.readline(),返回一個包含文件所有行的列表。</P><PRE>>>> f.readlines()['This is the first line of the file.\012', 'Second line of the file\012']</PRE><PRE>f.write(string)把string的內容寫入到文件中,返回None。 >>> f.write('This is a test\n') </PRE><P>f.tell()返回文件對象的當前讀寫為止,按從文件開始的字節數算。為了改變讀寫位置,使用“f.seek(位移,從哪里)”。讀寫位置按一個參考點加上位移來計算,參考點用“從那里”參數指定,取0時從文件頭開始算,取1時按當前位置算,取2時從文件尾算。缺省值是0,從文件開始算。</P><PRE>>>> 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'</PRE><P>用外一個文件后調用f.close()關閉文件,釋放打開文件所占用的系統資源。文件關閉后再使用此文件對象就無效了。</P><PRE>>>> f.close()>>> f.read()Traceback (innermost last): File "<stdin>", line 1, in ?ValueError: I/O operation on closed file</PRE><P>文件對象還有其它一些不太常用的方法,例如isatty()和truncate(),參見庫參考手冊。 <H3>7.2.2 pickle模塊</H3><P>字符串可以很容易地從文件讀入或向文件寫出。讀入數值要麻煩一些,因為read()方法總是返回字符串,要把讀入的字符串傳給象string.atoi()這樣的函數,把象‘123’這樣的字符串轉換為對應的整數值123。但是,當你想保存更復雜的數據類型如列表、字典或類實例時,讀寫就要復雜得多。</P><P>Python的設計使程序員可以不必反復編寫調試保存復雜數據類型的代碼,它提供了一個叫做pickle的標準模塊。這個令人驚異的模塊可以把幾乎任何Python對象轉換為字符串表示,這個過程叫做腌制,從對象的字符串表示恢復對象叫做恢復。在腌制和反腌制之間,對象的字符串表示可以保存在文件或數據中,甚至于通過網絡連接傳送到遠程計算機上。</P><P> 如果你有一個對象x,有一個可寫的文件對象f,最簡單的腌制對象的辦法是下面一行代碼:<PRE>pickle.dump(x, f)</PRE><P>為了恢復對象,如果剛才的文件已打開用于讀取,文件對象名仍為f,則:</P><PRE>x = pickle.load(f)</PRE><P>(腌制和恢復還有其它用法,可以腌制多個對象,可以不把數據寫入文件,詳見庫參考手冊)。 </P><P>pickle是保存Python對象并被其它程序或同一程序以后再運行時調用的標準辦法,這種做法的專用術語叫做“持久對象”。因為pickle使用廣泛,許多Python擴展模塊的作者都留意使新增加的數據類型如矩陣可以正確地腌制和恢復。</P></BODY><!-- Mirrored from www.math.pku.edu.cn/teachers/lidf/docs/Python/7.html by HTTrack Website Copier/3.x [XR&CO'2005], Fri, 08 Jul 2005 11:49:14 GMT --></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -