Txt中保存以些數據,這些數據中我們要逐行read line出來進行處理,約定第一個字符為"#"的數據表示已經處理。
一個辦法是讀取txt,新增另外一個已完成處理txt來保存完成的數據。這樣進行對比。但我現在要的效果是在同一個Txt文本里面來標記處理過的數據。
這里面就用道理open方法的各種模式。
原理是這樣的:
首先"r"模式打開txt,讀取每一行的數據,判斷是否已經'#'過, 有"#"說明已經發送過,so continue跳過,
沒有"#"的,進行邏輯發送,當發送狀態為成功時UPdate該條記錄為"#"
update的時候,先新建對象打開該文件,(不能使用之前"r"模式打開的內容,因為第一次"r",已經保存在內存中,即使update該條記錄,上條記錄又會覆蓋)
且不能用“w”模式打開,為什么呢,因為'w'模式是刪除原數據,等在update的時候txt已經為空了。so
在再新建對象以'w+'模式打開,用這個對象去保存update生成的數據。這樣就不會覆蓋之前update的數據了。
現在先整一個txt為list.text 內容如下
id=12 id=53 id=89 #id=13 id=10 id=43 id=67 #id=98 id=76 id=33 id=86
其中id= 13與98的已經處理過了
代碼:
# -*- coding: utf-8 -*- import time import random f = open("list.txt", "r", encoding='utf-8') data = f.readlines() ''' 發送方法 ''' def sending(i): print('發送……'+i) rand=random.randint(1, 6) # 隨機生成發送失敗的概率 if rand>=2: return 1 else: return False ''' 寫入 “#” w+打開文件會將原文件內容刪除,可以同時對文件進行讀寫 r+打開文件會保持原文件內容不變,同樣可以同時對文件進行讀寫 ''' def writeD(current): cid = 0 string = '' rf = open("list.txt", "r+", encoding='utf-8') # rf是時時讀取txt內容(已經修改過的),f是已經保存在內存中 for orig in rf.readlines(): if cid == current: # 每完成一個, 給該【0】 記錄前添加 # string += "#" + orig else: string += orig cid+=1 rf.close() wf=open("list.txt",'w+',encoding='utf-8') # wf的 w+打開是刪除txt內容,寫入rf中修改的內容 wf.write(string) wf.close() j = -1 for i in data: j += 1 if i[0] == '#': continue status = sending(i) if status: writeD(j) time.sleep(3) # 休眠3秒 f.close()
運行效果:
#id=12 #id=53 id=89 #id=13 id=10 #id=43 id=67 #id=98 #id=76 id=33 #id=86