假设我在一个小应用程序中有以下字典。
dict = {'one': 1, 'two': 2}
如果我想将具有dict名称和所有内容的确切代码行写入文件,该怎么办? python中有一个函数可以让我这样做吗?或者我是否必须先将其转换为字符串?转换它不是问题,但也许有一种更简单的方法。
我不需要将它转换为字符串的方法,我可以做。但如果有一个内置功能可以为我做这个,我想知道。
为清楚起见,我想写的文件是:
write_to_file("dict = {'one': 1, 'two': 2}")
答案 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)