将变量写入文件,包括名称

时间:2009-12-14 13:34:34

标签: python

假设我在一个小应用程序中有以下字典。

dict = {'one': 1, 'two': 2}

如果我想将具有dict名称和所有内容的确切代码行写入文件,该怎么办? python中有一个函数可以让我这样做吗?或者我是否必须先将其转换为字符串?转换它不是问题,但也许有一种更简单的方法。

我不需要将它转换为字符串的方法,我可以做。但如果有一个内置功能可以为我做这个,我想知道。

为清楚起见,我想写的文件是:

write_to_file("dict = {'one': 1, 'two': 2}")

8 个答案:

答案 0 :(得分:51)

repr函数将返回一个字符串,它是你的dict的确切定义(除了元素的顺序,dicts在python中是无序的)。不幸的是,我无法告诉自动获取表示变量名称的字符串。

>>> dict = {'one': 1, 'two': 2}
>>> repr(dict)
"{'two': 2, 'one': 1}"

写入文件非常标准,就像任何其他文件一样:

f = open( 'file.py', 'w' )
f.write( 'dict = ' + repr(dict) + '\n' )
f.close()

答案 1 :(得分:22)

使用pickle

import pickle
dict = {'one': 1, 'two': 2}
file = open('dump.txt', 'w')
pickle.dump(dict, file)
file.close()

并再次阅读

file = open('dump.txt', 'r')
dict = pickle.load(file)
编辑:猜猜我误解了你的问题,对不起......但是泡菜可能会有所帮助。 :)

答案 2 :(得分:18)

这就是你想要的东西吗?

def write_vars_to_file(_f, **vars):
    for (name, val) in vars.items():
        _f.write("%s = %s\n" % (name, repr(val)))

用法:

>>> import sys
>>> write_vars_to_file(sys.stdout, dict={'one': 1, 'two': 2})
dict = {'two': 2, 'one': 1}

答案 3 :(得分:4)

你可以这样做:

import inspect

mydict = {'one': 1, 'two': 2}

source = inspect.getsourcelines(inspect.getmodule(inspect.stack()[0][0]))[0]
print [x for x in source if x.startswith("mydict = ")]

另外:确保不要影响内置的词典!

答案 4 :(得分:2)

我找到了一种简单的方法来获取字典值,及其名称!我还不确定要读回它,我将继续进行研究,看看是否可以解决。

代码如下:

your_dict = {'one': 1, 'two': 2}

variables = [var for var in dir() if var[0:2] != "__" and var[-1:-2] != "__"]

file = open("your_file","w")
for var in variables:
     if isinstance(locals()[var], dict):
          file.write(str(var) + " = " + str(locals()[var]) + "\n")
file.close()

这里唯一的问题是这会将名称空间中的每个字典输出到文件,也许您可​​以按值对它们进行排序? locals()[var] == your_dict供参考。

您也可以删除if isinstance(locals()[var], dict):以输出名称空间中的每个变量,无论类型如何。 您的输出看起来就像您的your_dict = {'one': 1, 'two': 2}一样。

希望这可以使您更近一步!如果可以弄清楚如何将它们读回到命名空间中,我将进行编辑:)

---编辑---

知道了!我添加了一些变量(和变量类型)以进行概念验证。这是我的“ testfile.txt”的样子:

string_test = Hello World
integer_test = 42
your_dict = {'one': 1, 'two': 2}

这是处理它的代码:

import ast

file = open("testfile.txt", "r")
data = file.readlines()
file.close()

for line in data:
    var_name, var_val = line.split(" = ")
    for possible_num_types in range(3):  # Range is the == number of types we will try casting to
        try:
            var_val = int(var_val)
            break
        except (TypeError, ValueError):
            try:
                var_val = ast.literal_eval(var_val)
                break
            except (TypeError, ValueError, SyntaxError):
                var_val = str(var_val).replace("\n","")
                break
    locals()[var_name] = var_val


print("string_test =", string_test, " :  Type =", type(string_test))
print("integer_test =", integer_test, " :  Type =", type(integer_test))
print("your_dict =", your_dict, " :  Type =", type(your_dict))

这是输出:

string_test = Hello World  :  Type = <class 'str'>
integer_test = 42  :  Type = <class 'int'>
your_dict = {'two': 2, 'one': 1}  :  Type = <class 'dict'>

我真的不喜欢这里的转换如何工作,try-except块又大又丑。更糟糕的是,您不能接受任何类型!您必须知道您期望接受什么。如果您只关心字典,这并没有那么糟糕,但是我确实想要更通用的东西。

如果有人知道如何更好地转换这些输入变量,我会来了解它!

无论如何,这仍然可以帮助您:D我希望我能帮忙!

答案 5 :(得分:1)

您是否只想知道如何为file写一行?首先,您需要打开文件:

f = open("filename.txt", 'w')

然后,您需要将字符串写入文件:

f.write("dict = {'one': 1, 'two': 2}" + '\n')

您可以为每一行重复此操作(+'\n'如果需要,可添加换行符)。

最后,您需要关闭文件:

f.close()

您也可以稍微聪明一点并使用with

with open("filename.txt", 'w') as f:
   f.write("dict = {'one': 1, 'two': 2}" + '\n')
   ### repeat for all desired lines

这将自动关闭文件,即使引发了异常。

但我怀疑这不是你要问的......

答案 6 :(得分:0)

字典的默认字符串表示似乎恰到好处:

>>> a={3: 'foo', 17: 'bar' }
>>> a
{17: 'bar', 3: 'foo'}
>>> print a
{17: 'bar', 3: 'foo'}
>>> print "a=", a
a= {17: 'bar', 3: 'foo'}

不确定是否可以获取“变量名称”,因为Python中的变量只是值的标签。请参阅this question

答案 7 :(得分:0)

1)制作字典:

X = {'a': 1}

2)写入新文件:

file = open('X_Data.py', 'w')
file.write(str(X))
file.close()

最后,在要作为变量的文件中,读取该文件,并使用数据文件中的数据创建一个新变量:

import ast
file = open('X_Data.py', 'r')
f = file.read()
file.close()
X = ast.literal_eval(f)