我有一个包含内容的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
的内容仅更改一次,即使它在循环中运行也是如此。
有人可以解释这种行为,也可以提出解决方法。
答案 0 :(得分:2)
脚本首次启动时,您只执行一次from test.values import a
。执行values.py
,该变量分配了a
变量。
重写文件不会导致import
再次执行,因此您永远不会使用文件中的新值重新分配a
。即使重新执行import
语句,它也不会被更新,因为Python会记住已导入的模块,并且不会重新导入它们(请参见python import multiple times)。
要继续添加文件中的值,您需要重复运行整个脚本,而不仅仅是循环调用changedata()
。或者,您可以changedata()
更新a
变量,而不使用new
。
答案 1 :(得分:1)
尽管您更改了values.py
的内容,并且希望a
的值相应地更新,但它不会发生。
这是因为python不会一直监视加载的模块以防万一它们被更改而重新加载它们。看看这个答案,它与您的答案非常相似:How do I reload a module after changing it?
答案 2 :(得分:1)
要详细说明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}覆盖a
中values.py
的先前值}。但是该函数然后返回该新值,并且行a + 10
将a = changedata(a)
的值覆盖为值a
,因此在下一次迭代中,a + 10
正试图覆盖此值新价值。 changedata()
的原始值将不再在文件a
中找到,因为它在第一次迭代中已被values.py
覆盖。
答案 3 :(得分:0)
您在这里:
我使用了一个额外的变量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()