如何存储和构建取决于用户输入的路径

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

我正在开发一个项目,该项目将操纵存储在计算机其他位置的数据。这些数据按案例文件夹组织,每个案例文件夹具有相同的结构,同一文件夹中的文件大部分相同。例如:

CaseDirectory
|- Case1 
|   |- file1.dat 
|   |- Folder1 
|      |- file2.dat 
|- Case2
|   |- file1.dat 
|   |- Folder1 
|      |- file2.dat 

所以我想存储文件 1、文件 2 和文件夹 1 的路径,这样我就知道在哪里读取或写入必要的文件(实际上,至少有几个这样的路径)。现在我有一个文件,其中这些路径以字符串形式存储在字典中,然后我使用 format 替换 CaseDirectory 路径和 Case 名称来获取我需要的文件的实际路径。

到目前为止效果很好,但缺点是需要找到我想要的文件所需的特定密钥,并且在访问存储在字典中的信息时容易出现拼写错误。

这就是我所拥有的:

from pathlib import Path

paths_storage = {}
paths_storage["FILE1"] = "{case_directory_path}/{case_name}/file1.dat"
paths_storage["FOLDER1"] = "{case_directory_path}/{case_name}/Folder1/"
paths_storage["FILE2"] = "{case_directory_path}/{case_name}/Folder1/file2.dat"

parameters = {
  "case_directory_path": ".",   # The user will select this
  "case_name": "Case2",         # Same
}

file1_path = Path(paths_storage["FILE1"].format(**parameters))

我想要的是用一种我可以做的方式来包装它:

file1_path = path_generator.FILE1
并获取文件的路径。为了做到这一点,我正在考虑将路径字符串存储和路径生成分为 2 个类:

from dataclasses import dataclass
from pathlib impor Path
from typing import ClassVar

@dataclass(frozen=True)
class PathTemplates:
  FILE1: ClassVar[str] = "{case_directory_path}/{case_name}/file1.dat"
  FOLDER1: ClassVar[str] = "{case_directory_path}/{case_name}/Folder1/"
  FILE2: ClassVar[str] = "{case_directory_path}/{case_name}/Folder1/file2.dat"

class PathGenerator
  def __init__():
    self._parameters = {}

  def add_parameter(key:str, value:str):
    self._parameter[key] = value

  def _build_path(path_string: str) -> Path:
    return Path(path_string.format(**self._parameters))


path_generator = PathGenerator()
path_generator.add_parameter("case_directory_path", ".")
path_generator.add_parameter("case_name", "Case2")

file1_path = path_generator.FILE1

现在我缺少一个重要的部分,那就是如何在 PathGenerator 中生成属性,使它们与 PathTemplates 中的常量具有相同的名称,并让它们调用 _build_path 函数来生成路径。

我选择使用 2 个类,因为 PathTemplates 中的字符串常量的数量可以不断扩展,并且我不想让 PathGenerator 类变得混乱。此外,我可以将 PathTemplates 数据类添加到我的constant.py 文件中。

我也愿意采用不同的做事方式,但理想情况下我希望最终为这些路径拥有一个命名空间,这样我就可以更轻松地使用它们。

python path storage python-dataclasses
1个回答
0
投票
    from pathlib import Path
    
    class PathGenerator:
        def __init__(self):
            self._parameters = {}
            self._path_templates = {
                "FILE1": "{case_directory_path}/{case_name}/file1.dat",
                "FOLDER1": "{case_directory_path}/{case_name}/Folder1/",
                "FILE2": "{case_directory_path}/{case_name}/Folder1/file2.dat"
            }

    def add_parameter(self, key: str, value: str):
        self._parameters[key] = value

    def __getattr__(self, attr: str) -> Path:
        if attr in self._path_templates:
            return self._build_path(self._path_templates[attr])
        else:
            raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{attr}'")

    def _build_path(self, path_string: str) -> Path:
        return Path(path_string.format(**self._parameters))

# Usage
path_generator = PathGenerator()
path_generator.add_parameter("case_directory_path", ".")
path_generator.add_parameter("case_name", "Case2")

file1_path = path_generator.FILE1

PathGenerator
类根据模板和参数动态生成文件路径。它将路径模板存储在字典中。像
add_parameter
这样的方法可以实现动态参数添加。
__getattr__
方法在访问
FILE1.

等属性时会触发路径构造
© www.soinside.com 2019 - 2024. All rights reserved.