逐行遍歷文件:
方法一:一次讀入,分行處理: readlines()
缺點:一次讀入所有信息,對於大文件來說會消耗很多計算機內存
1 fname = input('請輸入要打開的文件名稱:') 2 fo = open(fname,"r") 3 for line in fo.readlines(): #f.readlines()讀入所有行,將文件以每行為元素形成列表(每一行都是一個長字符串) 4 print(line) 5 fo.close()
方法二:分行讀入,逐行處理:直接遍歷文件句柄
1 fname = input("請輸入要打開的文件名稱:") 2 fo = open(fname,"r") 3 for line in fo: #fo是文件句柄 4 print(line) 5 fo.close()
有利於處理極大文件。
實例:自動軌跡繪制用兩種方式實現:
注:這段代碼用到了eval()函數,所以txt數據文件中不能出現類似060,以0開頭的數字,否則會報錯“syntaxError: invalid token”
1 #Autotrackdraw.py #方法二 2 import turtle as t 3 4 t.setup(800,600,0,0) 5 t.pensize(5) 6 t.pencolor("red") 7 8 #數據讀取 9 f = open("test.txt") #只讀方式打開文件為:文件句柄f 10 l = [] #創建一個空列表 11 for ch in f: #用for...in.逐一處理每一行 12 ch = ch.replace('\n','') #遍歷字符串,用空字符代替轉義符\n 13 l.append(list(map(eval,ch.split(","))))#將一行字符串以逗號分割形成列表,並對列表的每個元素用eval()函數處理, 14 print(l) #然后以子列表加入父列表。 15 f.close() 16 for i in range(len(l)): #對列表所有元素循環,按參數執行畫筆程序。 17 t.pencolor(l[i][3],l[i][4],l[i][5]) #i[1,2,3,4,5]: 18 if l[i][1] == 0: #i[0]:行進距離 19 t.left(l[i][2]) #i[1]:轉向判斷 20 else: #i[2]:轉向角度 21 t.right(l[i][2]) #i[3]-i[5]:RGB顏色 22 t.fd(l[i][0]) 23 t.done()
1 #AutotrackdrawV2.py #方法一 2 import turtle as t 3 4 t.setup(800,600,0,0) 5 t.pensize(5) 6 t.pencolor("red") 7 8 with open('test.txt','r') as f1: #用with打開文件,用readlines()讀入所有行,以每行為元素生成列表。 9 list1=f1.readlines() 10 for i in range(len(list1)): 11 list1[i]=list1[i].rstrip('\n') #對列表進行遍歷,rstrip()去掉每個列表元素的轉義符\n 12 list1[i]=list(eval(list1[i])) #每個列表元素仍然為字符串,用eval()去掉引號,轉換為元組,再用list()轉換為子列表 13 14 print(list1) 15 16 for i in range(len(list1)): 17 t.pencolor(list1[i][3],list1[i][4],list1[i][5]) 18 if list1[i][1]==0: 19 t.left(list1[i][2]) 20 else: 21 t.right(list1[i][2]) 22 t.fd(list1[i][0]) 23 t.done()
結果: