【问题标题】:Variable name to string in PythonPython中字符串的变量名
【发布时间】:2012-10-02 09:42:24
【问题描述】:

我已经用 Python 编写了一些代码,我想将一些变量保存到具有变量名称的文件中。

以下代码:

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

应创建 2 个文件,一个名为 variableName1.txt,另一个名为 variableName2.txt,每个文件都应包含调用函数时对应变量的值。

这个变量名在代码中应该是唯一的。

谢谢!

【问题讨论】:

  • 那么,问题是什么?您应该通过documentation 来读取和写入文件..
  • file1 = open(Name,'w'),其中 Name 是一个字符串,然后是 file1.write1(var1)。最后你关闭文件 file1.close()
  • 你试过什么没用?
  • 如果您的问题得到解决,请不要忘记接受任何答案。

标签: python variables filenames


【解决方案1】:

不,这行不通。当您在此处写入变量名称时,它会将变量的值 3.14 等传递给 save_variable_to_file()。尝试以下变体之一:

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

或:

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

这里有一个good tutorial,如果你认真学习 Python,你一定要看看。

【讨论】:

  • save_variable_to_file()如果只给它内容怎么知道文件名呢?
  • 它们做的完全一样;他们传递值,而不是名称。 save_variable_to_file需要2条信息;名称和值(或查找名称以获取值的位置)。
【解决方案2】:

可以找到变量的名称,被调用的函数可以使用以下方法获取其调用者的变量:

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)

但这可能是一个非常糟糕的主意。请注意,我已将值转换为字符串,您希望如何保存字典和列表?稍后您将如何重建变量?

import glob

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

print(locals())

使用 exec 之类的东西可能会带来安全风险,使用 pickle、JSON 或 YAML 之类的东西可能会更好。

【讨论】:

    【解决方案3】:

    很遗憾,无法找出变量的名称。要么你扩展你的函数以允许一个字符串作为参数,要么你必须使用另一个解决方案:

    save_variable_to_file("variableName1", variableName1)
    

    另一种解决方案是将变量存储在 dict 中,这也允许检索 keys

    myVariables = {}
    myVariables["variableName1"] = 3.14
    
    
    for key, value in myVariables.items():
        save_variable_to_file(key, value)
    

    【讨论】:

      【解决方案4】:

      如何使用字典:

      var_dict = {'variable1': 3.14, 'variable2':1.09}
      for key, value in var_dict.items():
          with open('path\%s'%key, "w") as file:
              file.write(value)
      

      【讨论】:

      • 感谢您的 2 个解决方案:要么将名称作为字符串和变量传递,要么创建字典然后从那里读取名称。我认为无论哪种方式都应该可以正常工作。再次感谢。
      【解决方案5】:
      for key, value in locals().items():
          with open(key + '.txt', 'w') as f:
              f.write(value)
      

      应该做你的伎俩 - 只要要考虑 所有 本地定义的变量。

      然而,一个更好的解决方案是将你需要的所有内容放入一个 dict 并按照其他人已经提出的那样行事。

      你甚至可以这样做:

      def save_files(**files):
          for key, value in files.items():
              with open(key + '.txt', 'w') as f:
                  f.write(value)
      

      然后

      save_files(**my_previously_defined_dict)
      save_files(**locals()) # as example above
      save_files(filename='content')
      

      【讨论】:

      • 遍历所有 locals() 将是一团糟,您至少应该确保只考虑不以 _ 开头的键。
      • 我有数百个变量,这个操作意味着在几分钟内每秒完成 500 次。这种方式会不会导致大量的for循环开销,从而减慢程序的速度?
      • @Michael 它的目的是作为第一种方法,在这种情况下需要一些优化 - 正如我所写的那样,“只要考虑 /all/ 本地定义的变量”。如果不是这种情况,则必须修改代码,例如按照你建议的方式。
      • @user1713952 听起来工作量很大 - 你认为你有什么替代方案?
      • @user1713952:如果您有数百个变量,并且您没有将它们放在自己的命名空间中以简单地将它们作为键值对进行迭代,那么您肯定在程序中做错了.无论如何,关于问题的更多细节,你会得到更好的答案。
      【解决方案6】:

      变量没有名称。当您的脚本运行时,它会为一些与通常称为变量交互的对象创建一个或多个标识符,但这些都是临时的,并且在程序结束时不再存在。即使您保存它们,您也会面临相反的问题,即如何将它们转回具有与保存值相关联的保存名称的标识符。

      【讨论】:

        【解决方案7】:

        如果你想获取你的变量名作为字符串,使用 python-varname 包(python3):

        from varname import nameof
        
        s = 'Hey!'
        
        print (nameof(s))
        

        输出:

        s
        

        在这里获取包:

        https://github.com/pwwang/python-varname

        【讨论】:

          猜你喜欢
          • 2018-05-09
          • 1970-01-01
          • 2021-03-07
          • 1970-01-01
          • 1970-01-01
          • 2022-08-11
          • 2017-06-21
          • 1970-01-01
          • 2016-05-23
          相关资源
          最近更新 更多