简单的Python编码:如何使用文本文件作为变量?

时间:2016-03-17 01:08:22

标签: python python-2.7

如何通过我的主Python文件在其他文件中创建可更改的变量,然后更改它们?

我希望能够在我的主python文件中进行更改,然后将其转移到文本文件中。

以下是一个例子:

##this is inside the text file##
gold = 10

然后在我的代码中。

##this is inside the code##
money = gold
##I want that variable 'gold' to draw information from the txt file##

然后当我运行我的模块时。

##this is what I see when in the module##
>>money
money = 10
>>add money
How much?
>>10
total money = 20

然后,当我这样做时,它会更改文本文件

##this is inside the text file##
gold = 20

另外,什么是酸洗?

2 个答案:

答案 0 :(得分:4)

  

我正在尝试在与我的代码模块事物分开的文本文件中创建可变变量。因此,当我运行模块并添加到变量时,它将在文本文件中更改它。

①使用ConfigParser

存储变量(或值)的最简单方法是使用.ini file存储配置值。存储值:

>>> import configparser
>>> config = configparser.RawConfigParser()
>>> config.add_section('default')
>>> config.set('default', 'gold', '10')

读取值:

>>> with open('example.cfg', 'w') as configfile:
...     config.write(configfile)
... 
>>> 
>>> config = configparser.RawConfigParser()
>>> config.read('example.cfg')
['example.cfg']
>>> gold = config.getint('default', 'gold')
>>> print(gold)
10

但是你可能不喜欢输出:

% cat example.cfg
[default]
gold = 10

②使用JSON

那么你可能更愿意使用JSON来做同样的事情:

>>> config = dict(gold=10)
>>> json.dump(config, open('example.json', 'w'))
>>> import json

要加载它,你可以:

>>> import json
>>> config = json.load(open('example.json'))
>>> print(config)
{'gold': 10}

现在,您可能对dict感到不满。但是你可以使用**参数传递技巧:

使它成为函数内的变量
>>> def show_gold(gold):
...   print("I got {}g of gold!".format(gold))
... 
>>> show_gold(**config)
I got 10g of gold!

即使我建议您使用以前的解决方案,如果确实想要将其作为全局范围内的变量加载,您可以这样做:

>>> globals().update(config)
>>> print(gold)
10

③使用泡菜

使用pickle,你有同样的问题,你需要将你的数据嵌入某些东西,或者你不会让python记住变量的名称:

>>> import pickle
>>> gold = 10
>>> pickle.dump(gold, file=open('example.data', 'wb'))
>>> pickle.load(open('example.data', 'rb'))
10

所以你最好这样做:

>>> config = dict(gold=10)
>>> pickle.dump(config, file=open('example.data', 'wb'))
>>> pickle.load(open('example.data', 'rb'))
{'gold': 10}

你可以使用前面显示的相同技巧。虽然,与pickle的主要区别在于它使用二进制文件格式,使其更灵活,更快速地存储复杂和/或大型python实例:

% od -cx example.data
0000000 200 003   }   q  \0   X 004  \0  \0  \0   g   o   l   d   q 001
           0380    717d    5800    0004    0000    6f67    646c    0171
0000020   K  \n   s   .
           0a4b    2e73
0000024

因此,如果你想使用pickle很好地转储和恢复一个值,你可以使用一个对象的实例:

>>> import pickle
>>> class Foo:
...     def __init__(self):
...         self.gold = 10
... 
>>> foo = Foo()
>>> 
>>> pickle.dump(foo, open('example.data', 'wb'))
>>> bar = pickle.load(open('example.data', 'rb'))
>>> bar.gold
10

所以,基本上,pickle模块很不错,但不适合您的使用,因为您希望能够手动读取和修改文件。

结论

我建议您使用json来序列化和反序列化应用程序中的数据,因为输出简洁,优雅,因此易于阅读。我优先于PyYaml,当您需要手动编辑时,它会更好看。更常用的序列化器是ConfigParser,这就是我首先展示的那个。但是你不想使用非常好的pickle,而是使用你无法用编辑器改变的二进制格式。

HTH

答案 1 :(得分:0)

Pickling用于序列化和反序列化Python对象结构。可以对python中的任何对象进行pickle,以便将其保存在磁盘上。 pickle的作用是在将对象写入文件之前先将其“序列化”。 Pickling是一种将python对象(list,dict等)转换为字符流的方法。这个想法是这个字符流包含在另一个python脚本中重建对象所需的所有信息(更多信息http://pythontips.com/2013/08/02/what-is-pickle-in-python/)。你必须导入泡菜才能使用它。即,import pickle

对于您的问题,酸洗并非完全必要。您可以使用简单的文件命令来实现所需。如果调用文本文件" test.txt"

f = open("test.txt", "r+") # Open your text file
content = f.readlines()    # Read the lines and make a list
var = content[0].split()   # Split the list into individual words
money = var[0]             # var[0] is the first letter in the text file

使用必要的算法来更改值,但这是您访问" gold"从文本文件。 我的代码只有在文本文件与您提到的完全相同时才有效。 比如gold = 10或orange = 25