2015-11-18 54 views
0

我編寫了一個腳本,它將打開我的文本文件搜索某個單詞,然後選擇包含此單詞的行並將其分成三部分,然後選擇部分是數字並添加1,所以每次運行腳本時都會添加一個這個數字。這裏是腳本:替換文本文件中的字符串

#!/usr/bin/env python 
inputFile = open('CMakeLists.txt', 'r') 

version = None 
saved = "" 

for line in inputFile: 
    if "_PATCH " in line: 
     print "inside: ", line 
     version = line 

    else: 
     saved += line 

inputFile.close() 

inputFile = open('CMakeLists.txt', 'w') 

x = version.split('"') 
print "x: ", x 

a = x[0] 
b = int(x[1]) + 1 
c = x[2] 

new_version = str(a) + '"' + str(b) + '"' + str(c) 
print "new_version: ", new_version 

inputFile.write(str(saved)) 
inputFile.write(str(new_version)) 

inputFile.close() 

但我的問題是,新的編號印在文件末尾寫入,我希望它留在它原來的地方。有任何想法嗎 ?

感謝

+0

'inputFile.write(STR(保存))''inputFile.write (str(new_version))',你首先寫完全保存的文件,然後寫'new_version'這一行。相反,在第一個循環內編輯具有該版本號的行,並將其添加到'saved'中。然後你只需要將完整的'saved'字符串寫入文件。 – SuperBiasedMan

回答

0

的問題是,你寫的原始文件後的新版本號(不帶版本號線):

inputFile.write(str(saved)) 
inputFile.write(str(new_version)) 

您可以通過之前保存線和行後修復即分別包含版本然後保存他們在正確的順序:

#!/usr/bin/env python 
inputFile = open('CMakeLists.txt', 'r') 

version = None 
savedBefore = "" 
savedAfter = "" 

for line in inputFile: 
    if "_PATCH " in line: 
     print "inside: ", line 
     version = line 
    elif version is None: 
     savedBefore += line 
    else: 
     savedAfter += line 

inputFile.close() 

inputFile = open('CMakeLists.txt', 'w') 

x = version.split('"') 
print "x: ", x 

a = x[0] 
b = int(x[1]) + 1 
c = x[2] 

new_version = str(a) + '"' + str(b) + '"' + str(c) 
print "new_version: ", new_version 

inputFile.write(savedBefore) 
inputFile.write(str(new_version)) 
inputFile.write(savedAfter) 

inputFile.close() 

注意:您可能需要添加一些額外的文本第一行是版本使它具有與原始格式相同的格式(例如添加「_PATCH」)。

+0

謝謝,這真的很有幫助 – leaker

0

有很多要說的代碼。

你的錯誤在於你正在編寫你的「保存」行,並且在你編寫修改後的版本之後。因此,這個修改後的行會寫在文件的末尾。

此外,我建議你使用with陳述。

lines = []  
with open('CmakeLists.txt', 'r') as _fd: 
    while True: 
     line = _fd.readline() 
     if not line: 
      break 
     if '_PATCH ' in line: 
      a, b, c = line.split('"') 
      b = int(b) + 1 
      line = '{} "{}" {}'.format(a, b, c) 
     lines.append(line) 
with open('CmakeLists.txt', 'w') as _fd: 
    for line in lines: 
     _fd.write(line) 

此代碼是未經測試,可能包含了一些錯誤......還有,如果你的輸入文件是巨大的,將每行一個列表可以是一個壞主意。

0
#!/usr/bin/env python 
inputFile = open('CMakeLists.txt', 'r') 

version = None 
saved = "" 

for line in inputFile: 
    if "_PATCH " in line: 
     print "inside: ", line 
     version = line 
     x = version.split('"') 
     print "x: ", x 

     a = x[0] 
     b = int(x[1]) + 1 
     c = x[2] 

     new_version = str(a) + '"' + str(b) + '"' + str(c) 
     saved += new_version 
    else: 
     saved += line 

inputFile.close() 

inputFile = open('CMakeLists.txt', 'w') 
inputFile.write(str(saved)) 

inputFile.close() 

如果某行被發現,更新其內容,並加入到saved,一旦for循環結束,只寫saved到文件