假设我在一个小型应用程序中有以下字典。
1dict = {'one': 1, 'two': 2}
如果我想将包含dict名称和全部的确切代码行写入文件,该怎么办。 python中有一个函数可以让我做到吗? 还是我必须先将其转换为字符串? 转换它不是问题,但是也许有一种更简单的方法。
我不需要将其转换为字符串的方法。 但是,如果有一个内置函数可以为我完成此任务,我想知道。
为了清楚起见,我要写入文件的内容是:
1write_to_file("dict = {'one': 1, 'two': 2}")
也许您可以多说一些为什么要这样做?
对不起,还不清楚。 您的意思是只想知道如何向文件写入任意字符串吗?
我在将整个dict行写入文件后,包括dict变量的名称,在这种情况下就是dict。 那将是所有27个字母。
原因是创建一个程序,该程序创建一个python程序并将其输出到文件。
我不敢问您正在创建哪种程序,而该程序不能使用多行字符串string.Template()和repr()创建。 无论您使用哪种方法将生成的AST(假设您的应用是如此复杂)转换为Python源,都应比使用Pythons locals()函数或其同类控件更好地访问变量名称,这是我不得不猜测您从中获取dict的地方 在您的示例中。
repr函数将返回一个字符串,该字符串与您的字典的确切定义相同(除了元素的顺序外,字典在python中是无序的)。不幸的是,我无法告诉一种自动获取代表变量名的字符串的方法。
1
2
3>>> dict = {'one': 1, 'two': 2}
>>> repr(dict)
"{'two': 2, 'one': 1}"
写入文件是非常标准的事情,就像其他任何文件写入一样:
1
2
3
4f = open( 'file.py', 'w' )
f.write( 'dict = ' + repr(dict) + '
' )
f.close()
@bryan:对不起,我错误地认为写文件是很明显的……奇怪的是,事实并非如此。
谢谢,我最终这样做了。 将其写入文件实际上不是问题。
使用pickle
1
2
3
4
5import pickle
dict = {'one': 1, 'two': 2}
file = open('dump.txt', 'w')
pickle.dump(dict, file)
file.close()
并再次阅读
1
2file = open('dump.txt', 'r')
dict = pickle.load(file)
编辑:猜猜我误解了你的问题,对不起...但是泡菜可能会帮助所有相同的。 :)
那是写字典,但没有写字典的名字。
您正在寻找类似这样的东西吗?
1
2
3
4def write_vars_to_file(_f, **vars):
for (name, val) in vars.items():
_f.write("%s = %s
" % (name, repr(val)))
用法:
1
2
3>>> import sys
>>> write_vars_to_file(sys.stdout, dict={'one': 1, 'two': 2})
dict = {'two': 2, 'one': 1}
好东西,现在我们该怎么读呢?
我知道这是一篇旧文章,但是有没有理由将_f用作参数名称? 我专门询问有关使用_的问题。 这是在风格指南中还是只是个人习惯?
@MitchellTracy就在这里,这只是一个约定,但单个_作为变量名确实有意义。 看到这个帖子:stackoverflow.com/questions/5893163/
您可以这样做:
1
2
3
4
5
6import 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 =")]
另外:确保不要遮盖内置的dict!
谢谢。 我没有想到字典的影子。 做一些清洁工作。
我找到了一种获取字典值及其名称的简便方法!我还不确定要读回它,我将继续进行研究,看看是否可以解决。
这是代码:
1
2
3
4
5
6
7
8
9
10your_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]) +"
")
file.close()
唯一的问题是,这会将名称空间中的每个字典输出到文件,也许您可??以按值对它们进行排序? locals()[var] == your_dict供参考。
您还可以删除if isinstance(locals()[var], dict):以在名称空间中输出每个变量,无论类型如何。
您的输出看起来完全像您的decleration your_dict = {'one': 1, 'two': 2}。
希望这可以使您更进一步!如果可以弄清楚如何将它们读回到命名空间中,我将进行编辑:)
- -编辑 - -
得到它了!我添加了一些变量(和变量类型)以进行概念验证。这是我的" testfile.txt"的样子:
1
2
3string_test = Hello World
integer_test = 42
your_dict = {'one': 1, 'two': 2}
这是处理它的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import 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("
","")
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))
这就是输出:
1
2
3string_test = Hello World : Type =
integer_test = 42 : Type =
your_dict = {'two': 2, 'one': 1} : Type =
我真的不喜欢这里的转换方式,try-except块又笨又丑。更糟糕的是,您不能接受任何类型!您必须知道您期望接受什么。如果只关心字典,这并没有那么糟糕,但是我确实想要更通用的东西。
如果有人知道如何更好地转换这些输入变量,我将很乐意听到!
无论如何,这仍然可以帮助您:D我希望我能帮到您!
您是否只想知道如何在文件中写一行?首先,您需要打开文件:
1f = open("filename.txt", 'w')
然后,您需要将字符串写入文件:
1
2f.write("dict = {'one': 1, 'two': 2}" + '
')
您可以为每一行重复此操作(如果需要,+'
'将添加换行符)。
最后,您需要关闭文件:
1f.close()
您也可以稍微聪明一点,并使用with:
1
2
3
4with open("filename.txt", 'w') as f:
f.write("dict = {'one': 1, 'two': 2}" + '
')
### repeat for all desired lines
即使引发异常,这也会自动关闭文件。
但是我怀疑这不是你要的...
你是对的。 我可以写文件。:)
字典的默认字符串表示形式似乎是正确的:
1
2
3
4
5
6
7>>> 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中的变量只是值的标签。看到这个问题。