1. 程式人生 > >【20171002】python_語言設計(4)檔案

【20171002】python_語言設計(4)檔案

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()