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