简单的Python编程:如何将文本文件用作变量?

19 浏览
0 Comments

简单的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是什么?

admin 更改状态以发布 2023年5月24日
0
0 Comments

泡菜(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。

0
0 Comments

我试图在与我的代码模块分离的文本文件中创建可变变量。因此,当我运行该模块并添加变量时,它将在文本文件中更改。

① 使用 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,因为它使用不能通过编辑器更改的二进制格式。

希望能帮助您。

0