2014-03-30 239 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的新手,我不想用信息轰炸他 –