程式碼Python入門(七、檔案)
阿新 • • 發佈:2019-02-14
常見檔案運算:
在任何情況下,Python程式中的文字檔案採用字串的形式。讀取檔案時會返回字串形式的文字,文字作為字串傳遞給write方法。 與print語句不同的是,當你把資料寫入檔案時,Python不會自動把物件轉換為字串——你必須傳遞一個已經格式化的字串。 因此,我們之前見過的處理檔案時可以來回轉換字串和數字的工具遲早會派上用場(例如,int、float、str以及字串格式表示式)。 Python也包括一些高階標準庫工具,用來處理一般物件的儲存(例如,pickle模組)以及處理檔案中打包的二進位制資料(例如,struct模組)。 在Python中,一旦物件不再被引用,則這個物件的記憶體空間就會自動被收回。當檔案物件被收回的時候,如果需要,Python也會自動關閉該檔案。 這就意味著你不需要總是手動去關閉檔案,尤其是對於不會執行很長時間的簡單指令碼。 但是 ,檔案的這個收集完成後自動關閉的特性不是語言定義的一部分。因此,手動進行檔案close方法呼叫是我們需要養成的一個好習慣。output = open('/tmp/spam','w') 建立輸出檔案('w'是指寫入) input = open('data','r') 建立輸入檔案('r'是指讀寫) input = open('data') 'r'是預設值 aString = input.read() 把整個檔案讀進單一字串 aString = input.read(N) 讀取之後的N個位元組(一或多個)到一個字串 aString = input.readline() 讀取下一行(包括行末識別符號)到一個字串 aList = input.readlines() 讀取整個檔案到字串列表 output.write(aString) 寫入位元組字串到檔案 output.writelines(aList) 把列表內所有字串寫入檔案 output.close() 手動關閉(當檔案收集完成時會替你關閉檔案) output.flush() 把輸出緩衝區刷到硬碟中,但不關閉檔案 anyFile.seek(N) 修改檔案位置到偏移量N處以便進行下一個操作
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
myfile = open('myfile.txt', 'w')
myfile.write('hello text file\n')
myfile.close()
(自動建立檔案)
myfile = open('file', 'w') # 開啟檔案(若該檔案不存在則建立)
myfile.write('hello text file\n')
myfile.close()
在檔案中寫入 : hello text file
myfile = open('myfile.txt') # 'r'是預設值
print "'", myfile.readline(), "'"
print "'", myfile.readline(), "'"
這個例子把文字寫成字串,包括行終止符\n。寫入方法不會為我們新增行終止符,所以程式必須包含它來嚴格地終止行
(否則,下次寫入時會簡單地延長檔案的當前行)
X, Y, Z = 43, 44, 45
S = 'Spam'
D = {'a': 1, 'b': 2}
L = [1, 2, 3]
F = open('myfile.txt', 'w')
F.write(S + '\n')
F.write('%s, %s, %s\n' % (X, Y, Z)) # '%s, %s, %s\n' % (X, Y, Z)字串格式化,
# 基於字典的字串格式化:"%(n)d %(x)s" % {"n":1, "x": "spam"}
F.write(str(L) + '$' + str(D) + '\n')
F.close()
bytes = open('myfile.txt').read()
print bytes
F = open('myfile.txt')
line = F.readline()
print "'", line, "'"
print line.rstrip() # rstrip方法去掉多餘的行終止符,不改變line
print "'", line, "'"
line = F.readline()
print line
parts = line.split(',') # 使用字串split方法,從逗號分隔符的地方將整行隔開,得到行有個別數字的子字串列表
print parts
print int(parts[1]) # 轉換為整數
numbers = [int(P) for P in parts] # 列表解析,通過for迴圈,將列表中每一項執行 int(P)語句(轉換為整數)
print numbers
line = F.readline()
print line
parts = line.split('$')
print parts
print eval(parts[0]) # eval是一個內建函式,能夠把字串當做可執行程式碼(技術上講,就是一個含有Python表示式的字串)
objects = [eval(X) for X in parts] # 列表解析
print objects
**用pickle儲存Python的原生物件
pickle模組是能夠讓我們直接在檔案中儲存幾乎任何Python物件的高階工具,也並不要求我們把字串轉換來轉換去。就像是超級通用的資料格式化和解析工具。
例如,在檔案中儲存字典
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import pickle
D = {'a': 1, 'b': 2}
F = open('myfile.txt', 'w')
pickle.dump(D, F) # pickle any object to file 將物件寫入檔案中
F.close()
# 取回物件
F = open('myfile.txt')
E = pickle.load(F) # Load any object from file 物件重建
print E
'''
取回等價的字典物件,沒有手動斷開或轉換的要求。pickle模組執行所謂物件序列化(object serialization),
也就是物件和字串之間的相互轉換。但我們要做的工作卻很少。事實上,pickle內部將字典轉成字串形式
'''
print "實際寫入內容"
print open('myfile.txt').read()