7 Python 輸入和輸出
呈現程式輸出結果的方式有很多,可以以可讀方式列印出來,也可以寫入檔案以便將來使用。這一章,將會講述這些可能的方式。
Table of Contents
1 輸入格式
很多時候,我們不僅僅想只列印出結果,還對輸出格式有所需求。有兩種方式可以完成這一點,一是使用字串的分割,合并,等 功能自己確定輸出格式,你可以得到你想要的任何布局。二是使用 str.format() 函數。 這裡有一個問題,如何把各種各樣的值轉化為字串呢?Python 提供了 repr() 和 str() 來將任何值轉化為字串。 str() 函數會返回人類易讀的格式, 而repr()則會返回供解譯器讀取的格式。但是,如果轉化不成人類易讀的方式,兩個函數 的輸出就會一樣。
>>> print str('hello\n')hello>>> print repr('hello\n')'hello\n'
下面是兩種列印列表的方式:
>>> for i in range(1,11):... print repr(i).rjust(2), repr(i*i).rjust(3),... print repr(i*i*i).rjust(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 i in range(1,11):... print '{0:2d} {1:3d} {2:4d}'.format(i,i*i,i*i*i)... 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
注意2,3,4是指占幾列,列之間的空格是python自動加上的,除str.rjust()之外,還有str.ljust(),str.center(), 它們預設不會截斷,除非你用 r.ljust(n)[:n] 指定. : 前的數字表示這一列的內容顯示format後的第幾個參數,後面的數字表示占幾列
還有一個方法,str.zfill(),可以在數字左邊加0.
>>> '12'.zfill(4)'0012'
str.format() 使用的基本方式就是
>>> 'this is a {} called {}'.format('language','python')'this is a language called python'
{}內的內容決定了這個位置是什麼
>>> 'this is a {} called {}'.format('language','python')'this is a language called python'>>> 'this is a {0} called {1}'.format('language','python')'this is a language called python'>>> 'this is a {1} called {0}'.format('language','python')'this is a python called language'>>> 'this is a {1} called {1}'.format('language','python')'this is a python called python'
如果{}內出現了關鍵字,其內容由format後的定義決定
>>> 'my favourite language is {lan}'.format(lan = 'python')'my favourite language is python'
舊的字串格式 str.format() 是一種新的字串格式化方式,以前的代碼都使用 %, 和sprintf差不多
>>> pi = 3.1415926>>> 'test float format:%5.2f' % pi'test float format: 3.14'
2 讀寫檔案
open() 返回一個檔案對象,經常帶有兩個參數:open(filename, mode) mode 可以為:
- r: 唯讀
- w: 唯寫
- a: 添加
- r+: 讀寫
- mode 也可以預設,預設為r
>>> open('fileToTest.hi', 'r')<open file 'fileToTest.hi', mode 'r' at 0xb6e6ad30>
上述代碼會返回一個檔案對象,我們可以用它進行檔案操作
>>> fileobj = open('fileToTest.hi', 'r')>>> fileobj.read()'this is a file to be test by python\nthis is second line\nthis is end line'>>> fileobj.read()''
把檔案內容讀完後,再去讀就會返回Null 字元串
還可以一行一行讀
>>> fileobj = open('fileToTest.hi', 'r')>>> fileobj.readline()'this is a file to be test by python\n'>>> fileobj.readline()'this is second line\n'>>> fileobj.readline()'this is end line'
或者返回多行構成的list
>>> fileobj = open('fileToTest.hi', 'r')>>> fileobj.readlines()['this is a file to be test by python\n', 'this is second line\n', 'this is end line']
另一種逐行讀取的方式是:
>>> fileobj = open('fileToTest.hi', 'r')>>> for line in fileobj:... print line... this is a file to be test by pythonthis is second linethis is end line
可以使用 f.wirte(string) 寫入檔案
>>> fw = open('fileToTest.hi', 'w')>>> fw.write('Hello,pyhon\nhi,jack')>>> fw.close()
寫入之後要用f.close()關閉檔案對象,否則f.write(str)沒有真正寫入檔案。
如果一個值不是字串,可以用str()先轉化為字串,再用f.wirte()寫入。
f.tell()返迴文件對象當前位置,f.seek(offset, fromWhat) 用於設定當前位置
>>> fr = open('fileToTest.hi', 'r')>>> fr.tell()0L>>> fr.read()'hihio,pyhon\nhi,jack'>>> fr.tell()19L>>> fr.read()''>>> fr.seek(0,0)>>> fr.read()'hihio,pyhon\nhi,jack'
如果僅僅是讀寫字串,那麼沒什麼大問題,但是如果檔案中儲存的是整數,或者更複雜的資料結構,比如字典。就會 遇到麻煩,因為讀寫都是針對字串而言的。鑒於這個原因,python提供了名為 pickle 的模組。可以將任何類型的 python 對象轉化為字串,這個過程稱為 picking. 反過來也可以將字串轉化為任何類型的對象,這個過程稱為 unpicking.
例如:x 是一個對象, f 是一個用於寫的檔案對象, picking過程就是:
pickle.dump(x, f)
unpicking過程:
x = pickle.load(f)
下面做一個測驗
>>> fw = open('foo.c', 'w')>>> x = {'asdf','qwert'}>>> import pickle>>> pickle.dump(x,fw)>>> fw.close()>>> fr = open('foo.c', 'r')>>> y = pickle.load(fr)>>> yset(['qwert', 'asdf'])
原文連結:http://docs.python.org/2/tutorial/inputoutput.html