Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Variable name to string in Python

I have written some code in Python and I would like to save some of the variables into files having the name of the variable.

The following code:

variableName1 = 3.14
variableName2 = 1.09
save_variable_to_file(variableName1) # function to be defined
save_variable_to_file(variableName1)

should create 2 files, one named variableName1.txt and the other one variableName2.txt and each should contain the value of the corresponding variable at the time the function was called.

This variable name is supposed to be unique in the code.

Thanks!

HM

like image 951
user1713952 Avatar asked Nov 04 '22 14:11

user1713952


2 Answers

No, this won't work. When you write the variable name there, it gives the value of the variable, 3.14 and so on, to save_variable_to_file(). Try one of these variants:

d = dict(my_variable_name=3.14)
save_variable_to_file('my_variable_name', d['my_variable_name'])

or:

var_name = 'my_variable_name'
d = {var_name: 3.14}
save_variable_to_file(var_name, d[var_name])

Here is a good tutorial, that you should definitely go through, if you're serious about learning Python.

like image 86
Michael Avatar answered Nov 08 '22 10:11

Michael


It is possible to find the name of a variable, a called function can get its caller's variables using:

import sys

def save_variable_to_file(var):

     names = sys._getframe(1).f_globals
     names.update(sys._getframe(1).f_locals)
     for key in names.keys():
         if names[key] == var: 
             break

     if key:
         open(key+".txt","w").write(str(var))
     else:
         print(key,"not found")

thing = 42
save_variable_to_file(thing)

But it is probably a really bad idea. Note that I have converted the value to a string, how would you want dictionaries and lists to be saved? How are you going to reconstruct the variable later?

import glob

for fname in glob.iglob("*.txt"):
    vname = fname.rstrip(".txt")
    value = open(fname).read()
    exec(vname + "=" + value)

print(locals())

Using something like exec can be a security risk, it is probably better to use something like a pickle, JSON, or YAML.

like image 34
cdarke Avatar answered Nov 08 '22 08:11

cdarke