如何使用Python有效地将类存储在文本文件中?

2024-05-29 03:12:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件memory.txt,我想在第二行的字典中存储类武器()的一个实例

with open(memorypath(), "r") as f:
    lines = f.readlines()
    inv = inventory()
    if "MAINWEAPON" not in inv or inv["MAINWEAPON"] == "":
        inv["MAINWEAPON"] = f"""Weapon(sw, 0, Ability(0, "0"), ["{name}'s first weapon."], dmg=30, cc=20, str=15)"""
    lines[1] = str(inv) + "\n"
    with open(memorypath(), "w") as f:
        f.writelines(lines)

(inventory和memorypath来自我的另一个实用程序函数文件) 不过,根据我所拥有的,如果我得到inv["MAINWEAPON"],我只会得到字符串,而不是类。我必须像字符串一样存储它,否则我会得到类似<__main\__.Weapon object at (hexadecimal path thing)>的东西。 在获取inv["MAINWEAPON"]时如何获取类本身? 还有一件事,我觉得我对换行符很困惑,因为memory.txt文件有6行,但被缩短为5行,请告诉我我是否做错了什么


Tags: 文件字符串txt字典aswithopeninventory
2条回答

我可以建议的一个最简单的方法是dataclasses.asdict,如前所述;或者,使用支持数据类的序列化库。有很多好的,但出于这个目的,我可能会建议dataclass-wizard。此外,如果要将任意JSON对象转换为数据类结构,可以使用附带的CLI工具。序列化时,它将自动应用一个键转换(snake_casecamelCase),但这也很容易自定义

免责声明:我是此库的创建者(和维护者)

如果您有一个类,那么您可以将其表示为dict并将其保存为json格式

class Cat:
    name: str
    def __init__(self, name: str):
        self.name = name
    
    def dict(self):
        return {'name': self.name}
    @classmethod
    def from_dict(cls, d):
        return cls(name = d['name'])

现在,您可以将该类作为json保存到如下文件中:

import json
cat = Cat('simon')
with open('cat.json', 'w') as f:
    json.dump(cat.dict(), f)

您可以像这样再次加载json:

with open('cat.json', 'r') as f:
    d = json.load(f)
    cat = Cat.from_dict(d)

更新

自从Python3.7以来,已经具备了创建数据类的可能性,我在这里给出了一个示例,说明如何使用它将类保存为json格式

如果您想将json文件用作数据库,并且能够向其追加新实体,那么您必须将该文件加载到内存中,并追加新数据,最后覆盖旧的json文件,下面的代码正好可以做到这一点

from dataclasses import dataclass, asdict
import json

@dataclass
class Cat:
    name: str

def load_cats() -> list[Cat]:
    try:
        with open('cats.json', 'r') as fd:
            return [Cat(**x) for x in json.load(fd)]
    except FileNotFoundError:
        return []

def save_cat(c):
    data = [asdict(x) for x in load_cats() + [c]]
    with open('cats.json', 'w') as fd:
        json.dump(data, fd)

c = Cat(name='simon')
save_cat(c)
cats = load_cats()
print(cats)

相关问题 更多 >

    热门问题