如何修改模块中的变量和实例并在运行时将其保存在 python

how to modify variables and instances in modules and save it at runtime in python

我有 main.pyheader.pyvar.py

header.py

import var
class table():
    def __init__(self, name):
        self.name = name

var.py

month = "jen"
table = "" # tried to make empty container which can save table instance but don't know how

main.py

import header
import var

var.table = header.table(var.month)
var.month = "feb"

毕竟,我的意思是在这个项目结束之后。我希望 var.tablevar.month 被修改并保存在 var.py 中。

处理python中的引用真是令人困惑。

我想念 C 和指针。

当你的程序结束时,你所有的值都会丢失——除非你先保存它们,然后在下一个 运行 上加载它们。有多种不同的方法可以做到这一点;你想要哪一个取决于你有什么样的数据以及你用它做什么。

你永远不想做的一件事是将任意对象打印到一个文件中,然后尝试弄清楚以后如何解析它们。如果您的任何问题的答案是 ast.literal_eval,那么您保存的内容有误。

需要考虑的一件重要事情是您何时保存。如果有人使用 ^C 退出您的程序,而您仅在干净关闭期间保存,则您的所有更改都将消失。

Numpy/Pandas

Numpy 和 Pandas 有自己的 built-in 函数来保存数据。查看所有选项的 Numpy docs and Pandas docs,但基本选择是:

  • 文本(例如,np.savetxt):可移植格式,可在电子表格中编辑。
  • 二进制(例如np.save):文件小,保存和加载速度快。
  • Pickle(见下文,还有内置函数):可以保存具有任意 Python 个对象的数组。
  • HDF5。如果您需要 HDF5 或 NetCDF,您可能已经知道您需要它。

字符串列表

如果您只有一个 single-line 字符串列表,您只需将它们写入文件并逐行读回。很难再简单了,明明就是human-readable.

如果您需要每个值的短名称,或者需要单独的部分,但您的值仍然都是简单的字符串,您可能需要查看 configparser for CFG/INI 文件。但是一旦你变得比这更复杂,就寻找不同的格式。

Python 来源

如果您不需要保存任何东西,只需加载数据(您的用户可能想要编辑),您可以使用 Python 本身作为一种格式——您 import,或您 exec 的脚本文件。这当然是非常危险的,但是对于一个配置文件来说,只有那些已经在他们的计算机上有你的整个源代码的人才能编辑,这可能不是问题。

JSON 和朋友

JSON can save a single dict or list to a file and load it back. JSON is built into the Python standard library,大多数其他语言也可以加载和保存它。 JSON 个文件 human-editable,虽然不漂亮。

JSON 字典和列表可以是嵌套结构,里面有其他字典和列表,也可以包含字符串、浮点数、布尔值和 None,但不能包含其他内容。您可以使用其他类型的转换器扩展 json 库,但这需要一些工作。

YAML is (almost) a superset of JSON that's easier to extend, and allows for prettier human-editable files. It doesn't have builtin support in the standard library, but there are a number of solid libraries on PyPI, like ruamel.yaml.

JSON 和 YAML 都只能为每个文件保存一个字典或列表。 (该库允许您保存多个对象,但您无法将它们加载回来,所以要小心。)解决这个问题的最简单方法是创建一个大字典或列表,将所有数据打包到其中。但是 JSON Lines allows you save multiple JSON dicts in a single file, at the cost of human readability. You can load it just by for line in file: obj = json.loads(obj), and you can save it with just the standard library if you know what you're doing, but you can also find third-party libraries like json-lines 为你做。

Key-value 商店

如果您要存储的内容适合字典,但您希望它始终保存在磁盘上而不是显式保存和加载,您需要 key-value 存储。

dbm 是一种旧的但仍然可用的格式,只要您的键和值都是 small-ish 字符串并且您没有大量的字符串。 Python 使 dbm 看起来像 dict,因此您根本不需要更改大部分代码。

shelve 扩展了 dbm 以允许您保存任意值而不仅仅是字符串。它通过使用 Pickle(见下文)来做到这一点,这意味着它具有相同的安全问题,而且速度也很慢。

更强大的 key-value 商店(和相关的东西)通常称为 NoSQL 数据库。现在有很多这样的人; Redis 是最受欢迎的选择之一。还有很多东西要学,但这是值得的。

CSV

CSV stands for "comma-separated values", although there are variations that use whitespace or other characters. CSV is built into the standard library.

当您有一个所有具有相同字段的对象列表时,这是一种很好的格式,只要所有成员都是字符串或数字。但不要试图将其延伸到此之外。

CSV 文件只是勉强 human-editable 作为文本——但它们可以在 Excel 或 Google Sheets 等电子表格程序中非常容易地编辑。

泡菜

Pickle is designed to save and load just about anything. This can be dangerous if you're reading arbitrary pickle files supplied by users, but it can also be very convenient. Pickle actually can't quite save and load everything unless you do a lot of work to add support to some of your types, but there's a third-party library named dill 进一步扩展了支持。

Pickle 文件根本不 human-readable,只与 Python 兼容,有时甚至不兼容旧版本的 Python。

SQL

最后,您始终可以构建完整的关系数据库。这听起来很可怕。

Python 在标准库中内置了一个名为 sqlite3 的数据库。

如果这看起来太复杂,您可能需要考虑 SQLAlchemy,它让您无需学习 SQL 语言即可存储和查询数据。或者,如果你四处搜索,有许多更高级的 ORM 和库,可以让你 运行 直接针对数据库自定义列表理解,等等。

其他格式

还有许多其他数据文件标准; a few even come with support in the standard library。它们对特殊情况很有用——plist 文件匹配 w在 Apple 用于 macOS 和 iOS 的首选项; netrc 文件是一种 long-established 存储服务器登录列表的方式; XML如果你有一台只能穿越到2000年的时光机,那就太完美了;等。但通常情况下,您最好使用上述常见格式之一。