循环写入文件仅写入一次

问题描述

我有一个包含内容的python文件values.py

a=10

我还有一个包含内容的python文件execute.py

from test.values import a

def changedata():
    with open("values.py",'r+') as f:
        text = f.read()
        new = a + 10
        text = text.replace(str(a),str(new))
        f.seek(0)
        f.write(text)
        f.truncate()

for i in range(0,4):
    changedata()

当我运行execute.py时,理想情况下value.py的内容应该是a=40,但它应该是a=20

我不明白,为什么在循环运行时python每次迭代都不会更改value.py的内容。当前,value.py的内容仅更改一次,即使它在循环中运行也是如此。 有人可以解释这种行为,也可以提出解决方法。

解决方法

脚本首次启动时,您只执行一次from test.values import a。执行values.py,该变量分配了a变量。

重写文件不会导致import再次执行,因此您永远不会使用文件中的新值重新分配a。即使重新执行import语句,它也不会被更新,因为Python会记住已导入的模块,并且不会重新导入它们(请参见python import multiple times)。

要继续添加文件中的值,您需要重复运行整个脚本,而不仅仅是循环调用changedata()。或者,您可以changedata()更新a变量,而不使用new

,

尽管您更改了values.py的内容,并且希望a的值相应地更新,但它不会发生。 这是因为python不会一直监视加载的模块以防万一它们被更改而重新加载它们。看看这个答案,它与您的答案非常相似:How do I reload a module after changing it?

,

要详细说明Barmar的评论,您的问题是您没有在每次循环中都更新a的值。 a始终为10(即使在覆盖文件后重新导入它也仍然为10,因为正如Barmar指出的那样,Python非常聪明,不会重新导入已导入的内容)。为了解决这个问题,您需要更改每次迭代要覆盖的值。一种简单的方法是将变量传递给函数,如下所示:

from values import a

def changedata(data):
    with open("values.py",'r+') as f:
        text = f.read()
        new = data + 10
        text = text.replace(str(data),str(new))
        f.seek(0)
        f.write(text)
        f.truncate()
        return new

for i in range(0,4):
    a = changedata(a)

在此代码中,将a作为变量传递给函数changedata(),然后该函数试图用新值{{1}覆盖avalues.py的先前值}。但是该函数然后返回该新值,并且行a + 10a = changedata(a)的值覆盖为值a,因此在下一次迭代中,a + 10正试图覆盖此值新价值。 changedata()的原始值将不再在文件a中找到,因为它在第一次迭代中已被values.py覆盖。

,

您在这里:

我使用了一个额外的变量tmp。在您的代码中,replace方法始终搜索10来替换它。但是只有第一次找到数字10。其他所有10都不存在于values.txt

from test.values import a

tmp = a

def changedata():
    global tmp
    with open("values.py",'r+') as f:
        text = f.read()
        print(text) 

        new = tmp + 10
        
        text = text.replace(str(tmp),str(new))
        tmp = new
        
        f.seek(0)
        f.write(text)
        f.truncate()

for i in range(0,4):
    changedata()

或不使用全局变量且不导入a:


def changedata():
    with open("values.py",'r+') as f:
        text = f.read()
        print(text) 

        array = text.split("=")

        tmp = int(array[1])
        new = tmp + 10
        
        text = text.replace(str(tmp),str(new))
        
        f.seek(0)
        f.write(text)
        f.truncate()

for i in range(0,4):
    changedata()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...