有没有办法在python中保存变量的值(比方说整数)? 我的问题涉及多次调用(进入和退出)相同的python脚本(python文件,而不是python函数),最终创建一个txt文件。我想根据调用python代码的次数来命名txt文件:例如txt1.txt,...,txt100.txt。
编辑: 该问题与fortran中的SAVE参数无关。我的错误。
答案 0 :(得分:7)
不是真的。您可以做的最好是使用全局变量:
counter = 0
def count():
global counter
counter += 1
print counter
绕过对全局声明的需求的另一种选择是:
from itertools import count
counter = count()
def my_function():
print next(counter)
甚至:
from itertools import count
def my_function(_counter=count()):
print next(_counter)
最终版本利用了这样一个事实:函数是第一类对象,并且可以随时添加属性:
def my_function():
my_function.counter += 1
print my_function.counter
my_function.counter = 0 #initialize. I suppose you could think of this as your `data counter /0/ statement.
但是,看起来您确实希望将计数保存在文件或其他内容中。这也不是太难。你只需要选择一个文件名:
def count():
try:
with open('count_data') as fin:
i = int(count_data.read())
except IOError:
i = 0
i += 1
print i
with open('count_data','w') as fout:
fout.write(str(i))
答案 1 :(得分:5)
注意:我假设您的意思是:
多次调用(进入和退出)相同的python代码
您希望多次调用整个Python脚本,在这种情况下,您需要以某种方式在Python解释器外部序列化您的计数器,以使其下次可用。如果您只是想在一个Python会话中多次调用相同的函数或方法,那么您可以通过多种方式执行此操作,并指出mgilson's answer。
有很多方法可以序列化事物,但是你的实现与语言没有任何关系。您想将其存储在数据库中吗?将值写入文件?或者仅从上下文中检索适当的值是否足够?例如,根据output_dir
的内容,此代码每次调用时都会为您提供一个新文件。这显然很粗糙,但你明白了:
import os
def get_next_filename(output_dir):
'''Gets the next numeric filename in a sequence.
All files in the output directory must have the same name format,
e.g. "txt1.txt".
'''
n = 0
for f in os.listdir(output_dir):
n = max(n, int(get_num_part(os.path.splitext(f)[0])))
return 'txt%s.txt' % (n + 1)
def get_num_part(s):
'''Get the numeric part of a string of the form "abc123".
Quick and dirty implementation without using regex.'''
for i in xrange(len(s)):
if s[i:].isdigit():
return s[i:]
return ''
当然,您可以在Python脚本旁边的某处编写一个名为runnum.cfg
的文件,并将当前的运行编号写入其中,然后在代码启动时读取该文件。
答案 2 :(得分:1)
mgilson's response为原始问题提供了很好的选择。另一种方法是重构代码以分离从计算+保存中选择文件名的顾虑。这是一个代码草图:
for i in ...:
filename = 'txt%d.txt' % (i,)
do_something_then_save_results(..., filename)
如果您需要在很多地方执行此操作并希望减少代码重复,则生成器函数可能很有用:
def generate_filenames(pattern, num):
for i in xrange(num):
yield pattern % (i,)
...
for filename in generate_filenames('txt%d.txt', ...):
do_something_then_save_results(..., filename)
将“......”替换为您申请中的任何有意义的内容。