python变量名可以包括_关于python:将变量写入文件,包括名称

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

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中的变量只是值的标签。看到这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值