如何在python包中存储结构化数据?

问题描述 投票:0回答:1

我目前正在开发一个 python 包,它可以为非常低分辨率的驾驶游戏生成地图。

地图是通过组合预定义的图块生成的。这些瓷砖必须以某种方式存储。每个图块都是包含零到三个字符串的 9x9 集合数组。这些瓷砖大约有 30 个。

目前,我将图块作为常量存储在 python 文件中,并在需要使用它们时简单地导入它们。我认为这不会影响性能(文件只有 89 KB 大)。

但是,这感觉不太优雅。虽然数据在技术上是人类可读的,但文件太大,无法有效查看(约 3000 行)或编辑。

我可以将数据传输到

json
文件,但这不会使其更具可读性,并且在使用它时会添加额外的解码步骤。我不想使用
pickle
,因为 git 无法有效跟踪对 pickled 文件的更改。

理想的解决方案是纯文本(这样可以通过 git 有效地跟踪更改),并且在发布包时并不复杂(我听说访问包中的非 python 文件时需要额外的设置步骤?)。

python design-patterns architecture
1个回答
0
投票

您可以使用 CSV 文件来存储数据,它将像这样存储每个图块(您也可以对齐逗号以使其更具可读性):

["a", "a"], ["a"], [], ["a", "a", "a"], ["a"], [], ["a", "a"], ["a"], []
...
["a"], [], [], ["a", "a"], [], ["a"], [], ["a", "a", "a"], []

您可以将每个文件存储在单独的文件中(tile_0.csv、tile_1.csv 等),也可以将其全部存储在一个文件中(tiles.csv),并用空行分隔图块以方便阅读。由于您只有大约 30 个 9x9 的图块,因此运行时间可以忽略不计。

如果这不起作用,YAML 或 JSON 文件也可以工作,但我没有看到更多更具可读性的解决方案,因为它是 30 个 9x9 的字符串集。

如果它们在一个文件中
import csv

tiles = []
current_tile = []

with open(file_path, "r") as f:
    reader = csv.reader(f)
    for row in reader:
        # Skip empty rows
        if not row or all(cell.strip() == "" for cell in row):
            # Save current tile and start new one
            if current_tile:
                tiles.append(current_tile)
                current_tile = []
            continue
        
        # Parse the row into lists of strings
        parsed_row = [eval(cell) for cell in row]
        current_tile.append(parsed_row)

# Add the last tile if not already added
if current_tile:
    tiles.append(current_tile)
如果它们位于单独的文件中
import csv

num_tiles = 30
tiles = []
current_tile = []

for i in range(num_tiles):
    with open(f"tiles/tile_{i}.csv", "r") as f:
        reader = csv.reader(f)
        
        for row in reader:
            # Parse the row into lists of strings
            parsed_row = [eval(cell) for cell in row]
            current_tile.append(parsed_row)

        tiles.append(current_tile)
        current_tile = []
© www.soinside.com 2019 - 2024. All rights reserved.