如何通过我的主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
另外,什么是酸洗?
答案 0 :(得分:4)
我正在尝试在与我的代码模块事物分开的文本文件中创建可变变量。因此,当我运行模块并添加到变量时,它将在文本文件中更改它。
存储变量(或值)的最简单方法是使用.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来做同样的事情:
>>> 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