【20171002】python_語言設計(4)檔案
阿新 • • 發佈:2019-01-14
1.檔案
(1)檔案定義:儲存在外部介質上的資料或資訊集合,有序資訊
(2)文字顯示:計算機顯示功能
(3)編碼:資訊轉化的過程
ASCII碼:7個二進位制位表示128個字元;
Unicode編碼:跨語言跨平臺統一且唯一的二進位制編碼,每個字元兩個位元組長,65536個字元的編碼空間;
UTF-8編碼:可變長度的Unicode;
encode() 編碼
decode()解碼
GBK編碼:漢字內碼雙位元組編碼
(4)檔案資料:
文字檔案:ASCII(英文、數字),回車換行(\n)等,固定編碼
二進位制檔案:照片、音樂、視訊、程式等
節省空間,儲存快、精確,編碼變長靈活利用
2.檔案的基本處理
(1)開啟檔案:磁碟檔案與程式物件關聯
open()
=open(,)
r:只讀
w:只寫
a:附加到檔案末尾
rb:只讀二進位制檔案,檔案不存在則輸出錯誤
wb:只寫二進位制檔案,檔案不存在則自動建立檔案
ab:附加到二進位制檔案末尾
r+:讀寫
(2)檔案操作:讀取、寫入、定位、追加、計算
read():返回值為包含整個檔案內容的字串 readline():返回值為檔案下一行內容的字串 readlines():返回值為整個檔案內容的列表,每項是以換行符為結尾的一行字串 write():把含有本文資料或二進位制資料塊的字串寫入檔案中 writelines():針對列表操作,接受一個字串李彪作為引數,將它們寫入檔案,並且行結束符不會被自動加入
#檔案遍歷
#檔案較大時需要特別複雜
file=open(someFile,"r")
for line in file.readlines():
#處理一行檔案內容
file.close()
#檔案遍歷簡化版
file=open(someFile,"r")
for line in file:
#處理一行檔案內容
file.close()
#檔案拷貝程式碼例項
def main():
#使用者輸入檔名
f1=input("enter a source file:").strip()
f2=input("enter a source file:" ).strip()
#開啟檔案
infile=open(f1,"r")
outfile=open(f2,"w")
#拷貝資料
countLines=countchars=0
for line in infile:
countLines+=1
countChars+=len(line)
outfile.write(line)
print(countLines,"lines and",countChars,"chars copied")
infile.close()
outfile.close()
main()
(3)關閉檔案:切斷檔案與程式的聯絡,寫入磁碟,釋放檔案緩衝區
3.檔案例項一
根據檔案data.txt中的資料,使用turtile庫來動態繪製圖形路徑,每行六個元素
元素1:路徑前進畫素數
元素2:轉動方向,0為左,1為右
元素3:轉動角度
元素4-6:顏色rgb
#根據資料檔案在視窗中動態路徑繪製
import turtle
def main():
#設定視窗資訊
turtle.title('資料驅動的動態路徑繪製')
turtle.setup(800, 600, 0, 0)#800*600畫素,遠點在中心
#設定畫筆
pen = turtle.Turtle()
pen.color("red")
pen.width(5)
pen.shape("turtle")
pen.speed(5)
#讀取檔案
result=[]
file = open("data.txt","r")
for line in file:
result.append(list(map(float, line.split(','))))
print(result)
#動態繪製
for i in range(len(result)):
pen.color((result[i][3],result[i][4],result[i][5]))
pen.forward(result[i][0])
if result[i][1]:
pen.rt(result[i][2])#right
else:
pen.lt(result[i][2])#left
pen.goto(0,0)#畫筆定位回原點
if __name__ == '__main__':
main()
4.檔案例項二
多檔案讀寫:電話簿和郵箱簿合併
#利用字串和列表將兩個通訊錄文字合併為一個文字
def main():
#開啟檔案、讀寫檔案
ftele1=open('TeleAddressBook.txt','rb')
ftele2=open('EmailAddressBook.txt','rb')
ftele1.readline()#跳過第一行
ftele2.readline()
lines1 = ftele1.readlines()#電話資訊
lines2 = ftele2.readlines()#郵箱資訊
#建立空列表
list1_name = []
list1_tele = []
list2_name = []
list2_email = []
for line in lines1:#獲取第一個文字中的姓名和電話資訊
elements = line.split()
list1_name.append(str(elements[0].decode('gbk')))
list1_tele.append(str(elements[1].decode('gbk'))) #將文字讀出來的bytes轉換為str型別
for line in lines2:#獲取第二個文字中的姓名和郵件資訊
elements = line.split()
list2_name.append(str(elements[0].decode('gbk')))
list2_email.append(str(elements[1].decode('gbk')))
###開始處理###
lines = []
lines.append('姓名\t 電話 \t 郵箱\n')
#按索引方式遍歷姓名列表1
for i in range(len(list1_name)):
s= ''
if list1_name[i] in list2_name:
j = list2_name.index(list1_name[i]) #找到姓名列表1對應列表2中的姓名索引位置
s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])
s += '\n'
else:
s = '\t'.join([list1_name[i], list1_tele[i], str(' ----- ')])
s += '\n'
lines.append(s)
#處理姓名列表2中剩餘的姓名
for i in range(len(list2_name)):
s= ''
if list2_name[i] not in list1_name:
s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]])
s += '\n'
lines.append(s)
ftele3 = open('AddressBook.txt', 'w')
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()
print("The addressBooks are merged!")
if __name__ == "__main__":
main()