python替換文件中的某幾行操作技巧
python替換文件中的某幾行操作技巧
本文介紹使用python正則庫打開文件并替換文件中某幾行數(shù)據(jù)的可行方法。
【python技巧】替換文件中的某幾行
1. 背景描述
最近在寫一個后端項目,主要的操作就是根據(jù)用戶的前端數(shù)據(jù),在后端打開項目中的代碼文件,修改對應(yīng)位置的參數(shù),因為在目前的后端項目中經(jīng)常使用這個操作,所以簡單總結(jié)一下。
1. 文件路徑:./test.c 2. 文件內(nèi)容 …… case EPA: chan_desc->nb_taps = 7; chan_desc->Td = .410; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double *) malloc(chan_desc->nb_taps*sizeof(double)); chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_AMPS ; for (i = 0; i<chan_desc->nb_taps; i++) { chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); sum_amps += chan_desc->amps[i]; } for (i = 0; i<chan_desc->nb_taps; i++) chan_desc->amps[i] /= sum_amps; chan_desc->delays = epa_delays; chan_desc->ricean_factor = 1;//待修改位置 chan_desc->aoa = 0;//待修改位置 chan_desc->random_aoa = 0;//待修改位置 chan_desc->ch = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *)); chan_desc->chF = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *)); chan_desc->a = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *)); ……
2. 單行修改-操作步驟
1.讀取文件
使用python中的open()函數(shù)進(jìn)行文件讀取,將數(shù)據(jù)存儲在緩沖區(qū)。
path='./test.c' with open(path, 'r') as file: file_content = file.read()
2.查找文件替換位置
以查找chan_desc->ricean_factor = 1;//待修改位置
為例,查找這句話的起點和終點。
## 注:此步驟需要import re #2. 查找文件替換位置 start_index=file_content.find('chan_desc->ricean_factor = ')#起點 end_index=file_content.find('chan_desc->aoa = ',start_index)#終點 if end_index==-1 or start_index==-1: print('未找到待修改位置')
3.設(shè)置替換文件內(nèi)容
假設(shè)目前只修改這一行的參數(shù),
ricean_factor=3#假設(shè)這是要修改的參數(shù)信息 updata_content=file_content[:start_index]#獲取這行代碼之前的內(nèi)容 update_content+='chan_desc->ricean_factor = '+str(ricean_factor)+';//待修改位置'#修改這行代碼 update_content+=file_content[end_index:]#獲取這行代碼之后的內(nèi)容 #此時得到的update_content就是修改后的完整文件內(nèi)容,只修改了ricean_factor這一行的值
4.寫入文件
同樣使用python中的open函數(shù)。
if update_content!="":#如果修改內(nèi)容不為空 with open(path, 'w') as file:#w表示覆蓋寫入,之前的內(nèi)容都會被覆蓋 file.write(update_content)
5.總代碼
整體的代碼如下所示:
import re #1. 讀取文件 path='./test.c' with open(path, 'r') as file: file_content = file.read() #2. 查找文件替換位置 start_index=file_content.find('chan_desc->ricean_factor = ')#起點 end_index=file_content.find('chan_desc->aoa = ',start_index)#終點 if end_index==-1 or start_index==-1: print('未找到待修改位置') #3. 設(shè)置替換文件內(nèi)容 ricean_factor=3#假設(shè)這是要修改的參數(shù)信息 updata_content=file_content[:start_index]#獲取這行代碼之前的內(nèi)容 update_content+='chan_desc->ricean_factor = '+str(ricean_factor)+';//待修改位置'#修改這行代碼 update_content+=file_content[end_index:]#獲取這行代碼之后的內(nèi)容 #4. 寫入文件 if update_content!="":#如果修改內(nèi)容不為空 with open(path, 'w') as file:#w表示覆蓋寫入,之前的內(nèi)容都會被覆蓋 file.write(update_content)
3. 多行修改-操作步驟
1.多行修改思路
多行修改有兩種修改思路,如果修改部分比較集中,則可直接替換一整塊的字符串內(nèi)容,如果修改部分較為分散,則需要單獨查找修改位置,然后再分別進(jìn)行替換。
2.多行修改-整塊替換
try: with open(file_path, "r") as file: file_content = file.read() except Exception as e: return str(e) # 設(shè)置改寫內(nèi)容 updated_content = "" # 查找修改 start_index_1 = file_content.find("start_sentence")#要確保查找元素的唯一性 end_index_1 = file_content.find("end_sentence",start_index_1,) if start_index_1 == -1 or end_index_1 == -1: print("未找到待修改位置") return -1 # updated_content = file_content[:start_index_1]#獲取這行代碼之前的內(nèi)容 updated_content += "start_sentence和end_sentence之間的sentence_1;\n" updated_content += "start_sentence和end_sentence之間的sentence_2;\n" updated_content +=file_content[end_index_1:] ##此時updated_content就是修改后的完整文件內(nèi)容 if updated_content != "": with open(file_path, "w") as file: file.write(updated_content) else: print("修改失敗") return -1
3.多行修改-局部替換
try: with open(file_path, "r") as file: file_content = file.read() except Exception as e: return str(e) # 設(shè)置改寫內(nèi)容 updated_content = "" # 查找修改 start_index_1 = file_content.find("start_sentence_1")#要確保查找元素的唯一性 end_index_1 = file_content.find("end_sentence_1",start_index_1,) start_index_2 = file_content.find("start_sentence_2",end_index_1) end_index_2 = file_content.find("end_sentence_2",start_index_2,) start_index_3 = file_content.find("start_sentence_3",end_index_2) end_index_3 = file_content.find("end_sentence_3",start_index_3,) start_index_4 = file_content.find("start_sentence_4",end_index_3) end_index_4 = file_content.find("end_sentence_4",start_index_4,) if ( start_index_1 == -1 or end_index_1 == -1 or start_index_2 == -1 or end_index_2 == -1 or start_index_3 == -1 or end_index_3 == -1 or start_index_4 == -1 or end_index_4 == -1 ): print("未找到待修改位置") return -1 # updated_content = file_content[:start_index_1]#獲取這行代碼之前的內(nèi)容 updated_content += "start_sentence_1和end_sentence_1之間的內(nèi)容" updated_content +=file_content[end_index_1:start_index_2] updated_content += "start_sentence_2和end_sentence_2之間的內(nèi)容" updated_content +=file_content[end_index_2:start_index_3] updated_content += "start_sentence_3和end_sentence_3之間的內(nèi)容" updated_content +=file_content[end_index_3:start_index_4] updated_content += "start_sentence_4和end_sentence_4之間的內(nèi)容" updated_content += file_content[end_index_4:] ##此時updated_content就是修改后的完整文件內(nèi)容 if updated_content != "": with open(file_path, "w") as file: file.write(updated_content) else: print("修改失敗") return -1
到此這篇關(guān)于python替換文件中的某幾行的文章就介紹到這了,更多相關(guān)python替換文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對變量賦值的理解--Pyton中讓兩個值互換的實現(xiàn)方法
下面小編就為大家分享一篇Pyton中讓兩個值互換的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11Pytest單元測試框架如何實現(xiàn)參數(shù)化
這篇文章主要介紹了Pytest單元測試框架如何實現(xiàn)參數(shù)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例
這篇文章主要介紹了python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例,需要的朋友可以參考下2014-03-03Python基于socket實現(xiàn)簡單的即時通訊功能示例
這篇文章主要介紹了Python基于socket實現(xiàn)簡單的即時通訊功能,涉及Python基于socket模塊實現(xiàn)tcp通信客戶端與服務(wù)器端相關(guān)操作技巧,需要的朋友可以參考下2018-01-01python 把數(shù)據(jù) json格式輸出的實例代碼
下面小編就為大家?guī)硪黄猵ython 把數(shù)據(jù) json格式輸出的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10Python?matplotlib實戰(zhàn)之散點圖繪制
散點圖,又名點圖、散布圖、X-Y圖,是將所有的數(shù)據(jù)以點的形式展現(xiàn)在平面直角坐標(biāo)系上的統(tǒng)計圖表,本文主要為大家介紹了如何使用Matplotlib繪制散點圖,需要的可以參考下2023-08-08