這一章主要是講述程序展示其數據的一些方法,一般都是直接按照一定的格式輸出在屏幕,或者寫入到文件以便以后使用。按照一定格式的輸出,在python中實際就是對str的操作,主要就是介紹了formart()的靈活使用。然后就是基本的打開文件,內置的函數open()后,可以對文件進行簡單的讀取,按需讀取等,最后大致介紹了下JSON數據結構。
5.1 舊的字符串格式輸出方式
使用%輸出字符串,這是我未看文檔前知道的,也以為是唯一的print輸出字符串方式,看完之后才知道這種方式已經在2.7.11中被稱為old的了。
>>> import math >>> print 'The value of PI is approximately %5.3f.' % math.pi The value of PI is approximately 3.142.
5.2 友好的格式化輸出
如果你想更好的控制你的輸出而不是簡單的打印一些空格,通常有2種方式,一種是自己處理所有的字符串,使用string的切片和連接操作,字符串類型有一些方法,用於執行將字符串填充到指定列寬度的有用操作,第二種方法是使用str的format()方法。
要使用str的format()方法,當然首先要保證當前對象的類型就是string類型,string模塊提供了2個方法,可以講任何對象都轉換成string對象。str()和repr()。他們之間區別如下:str()返回一個人類可讀性強的字符串,而repr()返回式解釋器可讀的字符串;對於數字,列表,字段這些數據結構,使用這2個方法得到的是同樣的結果,但是對字符串和浮點數的使用是不相同的:
s = 'hello\n' print s print str(s) print repr(s) print str(math.pi) print repr(math.pi)
結果如下:
可以看到:repr()在操作string字符串的時候增加了引號和反斜杠,而str是沒有的。
現需要打印出1-10的1次方,2次方,3次方的值,如下所示:
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
按照以前的思維會怎么做呢?以我c++剛入門的功力寫,貌似更搓,需要打印數值,再打印空格。。。。
python單純的使用string類型的方法,可以這樣實現:
for x in range(1,11): print str(x).ljust(2),str(x*x).ljust(3),str(x*x*x).ljust(4)
ljust()是str模塊內的一個方法,函數原型是: S.ljust(width[, fillchar]) -> string,在字符串的左邊插入width個fillchar,默認fillchar是space。巧妙的實現了字符串后面空N格的需求,當然有左邊,肯定有右邊,也有中間,對應的方法是 str.ljust()
and str.center(),具體使用就不舉例了。
如果使用str的format方法,貌似更簡潔了:
for x in range(1,11): print '{0:10d} {1:10d} {2:10d}'.format(x,x*x,x*x*x)
format的基本使用如下:花括號及其中的字符(稱為格式字段)將被替換為傳遞給str.format()方法的對象。括號中的數字指傳遞給str.format()方法的對象的位置。
>>> print 'We are the {} who say "{}!"'.format('knights', 'Ni') We are the knights who say "Ni!
>>> print 'The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',other='Georg')
The story of Bill, Manfred, and Georg.
>>>table = {'name':'loleina','age':25}
>>>print 'name :{name}, age:{age:d}'.format(**table)
數字后后允許可選的':'和格式指令。這樣可以更好地控制如何設置值的格式。下面的例子將 Pi 轉為三位精度。
>>> import math >>> print 'The value of PI is approximately {0:.3f}.'.format(math.pi) The value of PI is approximately 3.142.
':'后面緊跟一個整數可以限定該字段的最小寬度。
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} >>> for name, phone in table.items(): ... print '{0:10} ==> {1:10d}'.format(name, phone) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd ==> 4127
5.3 讀寫文件
調用內置函數open()可以返回一個文件對象,一般都是帶2個參數:open(filename, mode)。
>>> f = open('workfile', 'w') >>> print f <open file 'workfile', mode 'w' at 80a0960>
第一個參數是一個含有文件名的字符串。第二個參數也是一個字符串,含有描述如何使用該文件的幾個字符。mode為'r'時表示只是讀取文件;w 表示只是寫入文件(已經存在的同名文件將被刪掉);'a'表示打開文件進行追加,寫入到文件中的任何數據將自動添加到末尾。 'r+'表示打開文件進行讀取和寫入。mode 參數是可選的,默認為'r'。
這個例子是官網的例子,運行后,在當前項目的目錄下生成了一個workfile的文件,類型為文件類型(不是文本類型),如果在文件名后加上txt,就生成了一個文本文檔類型。
在 Windows 平台上,模式后面追加 'b'表示以二進制方式打開文件,所以也有像'rb'、 'wb'和'r+b'這樣的模式。Python 在 Windows 平台上區分文本文件和二進制文件;讀取或寫入文本文件中時,行尾字符會被自動地稍加改變。這種修改對 ASCII 文本文件沒有問題,但會損壞JPEG或EXE這樣的二進制文件中的數據。在讀寫這些文件時一定要記得以二進制模式打開。在 Unix 平台上,在模式后面附加一個'b'也不會有壞處,這樣可以用寫好的文件訪問代碼來讀寫任何平台上的所有二進制文件。
得到文件句柄后,可以對文件進行讀寫操作,一次性讀取read();一行一行讀取readline(),不去掉換行符;寫操作write();查詢當前文件游標(偏移量)tell(),移動游標seek();read()函數內如果加整型參數,表示讀取整數個byte。舉例如下:
f = open('test.txt','r+') print f print f.read()
f.close()
運行結果:
<open file 'test.txt', mode 'r+' at 0x0341D1D8>
first line
second line
third line
r = open('workfile','r+') r.write('0123456789abcdefg') print r.tell() print r.seek(5) print r.read(1) print r.tell()
r.close()
運行結果:
17
None
5
6
在python中處理文件對象時使用with關鍵字是很好的做法。這樣做的好處在於文件用完后會自動關閉,即使過程中發生異常也沒關系。它還比編寫一個等同的try-finally語句要短很多,如果需要讀取文件內每一行,可以循環遍歷文件對象來讀取文件中的每一行。這是既省內存又非常快的簡單代碼。
with open('workfile','r') as f: for line in f: print line print f.closed
運行結果:
0123456789abcdefg
True
5.4 使用json存儲結構化數據
從文件中讀寫字符串並不是很難。數值就要多費點兒周折,因為read ()方法只會返回字符串,應將其傳入int()這樣的函數,就可以將'123'這樣的字符串轉換為對應的數值 123。當你想要保存更為復雜的數據類型,例如嵌套的列表和字典,手工解析和序列化它們將變得更復雜。Python 允許使用常用的數據交換格式JSON(JavaScript Object Notation)。標准模塊json可以接受 Python 數據結構,並將它們轉換為字符串表示形式;此過程稱為序列化。從字符串表示形式重新構建數據結構稱為反序列化。序列化和反序列化的過程中,表示該對象的字符串可以存儲在文件或數據中,也可以通過網絡連接傳送給遠程的機器。
這一章節,之前有專門總結過,再次就不墨跡了。可以點此鏈接進行查看: python對json的操作總結