Python 逐行修改txt每條記錄的內容


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM