简单的Python编程:如何将文本文件用作变量?
简单的Python编程:如何将文本文件用作变量?
如何通过我的主要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
另外,pickling是什么?
泡菜(Pickling)用于序列化和反序列化 Python 对象结构。Python 中的任何对象都可以进行泡菜,以便可以将其保存在磁盘上。泡菜所做的是,在将对象写入文件之前先“序列化”该对象。泡菜是将 Python 对象(列表、字典等)转换为字符流的一种方法。其思想是,此字符流包含了在另一个 Python 脚本中重构对象所需的所有信息(更多信息:http://pythontips.com/2013/08/02/what-is-pickle-in-python/)。您必须导入 pickle 才能使用它。即: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。
我试图在与我的代码模块分离的文本文件中创建可变变量。因此,当我运行该模块并添加变量时,它将在文本文件中更改。
① 使用 ConfigParser
存储变量(或值)的最简单方法是使用.ini
文件来存储配置值。存储值:
>>> 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
使用 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
,因为它使用不能通过编辑器更改的二进制格式。
希望能帮助您。