2014-03-30 195 views
0

我有這樣的代碼:爲什麼這段代碼不會替換這段文字?

count = -1 
with open("text.txt", "r") as f: 
    content = f.readlines() 
for line in content: 
    if line.startswith(" <Vertex>"): 
     count += 1 
     line = line.replace(str(line), str(" <Vertex> " + str(count) + " {\n")) 
     continue 
    else: 
     pass 
with open("text2.txt", "w") as f: 
    f.writelines(content) 

當它運行時,就應更換,與" <Vertex>"始於" <Vertex> 0 {",或任何數量的計數上的任何線。

當我運行它時,它運行良好,但是當我打開新的text2.txt文件時,它與text.txt完全相同。

我在做什麼錯?

+0

相關:[如何使用Python搜索和替換文件中的文本?](http ://stackoverflow.com/q/17140886/4279) – jfs

回答

3

您不寫回line,而是將變量行分配給一個新的字符串引用。你需要寫回的內容數組代替如下:

count = -1 
with open('text.txt', 'r') as f: 
    content = f.readlines() 

for index, line in enumerate(content): 
    if line.startswith(' <Vertex>'): 
     count += 1 
     content[index] = line.replace(str(line), str(" <Vertex> " + str(count) + " {\n")) 

with open('text2.txt', 'w') as f: 
    f.writelines(content) 

看看是否能爲你工作

您可能還需要考慮提高你的邏輯,因爲這隻會工作非常具體的模式。

例如你可以用line.contains('<Vertex>')因爲這取代line.startswith(" <Vertex>")應該給你相同的結果,假設使用XML你的工作

編輯:有許多其他的事情可以做,以提高你的代碼,但我不想用信息轟炸你。請參閱以下評論者的建議,以瞭解如何使其更加優化(儘管我假設您的工作規模不會產生影響)

+1

考慮到'range(len(content))'和'content [i]'而不是'enumerate(content)'和'line',因爲'enumerate'會爲每一行創建一個不必要的副本。此外,'else:pass'在這裏可以安全省略,因爲'else'總是可選的。 ('try..except'是'except'爲空時需要'pass'的地方。) –

+0

我正在考慮提及這些,但我不想更改代碼,希望對他更容易理解。我的印象是,OP可能是python的新手,我不想用信息轟炸他 –