gpt4 book ai didi

python - 使用 Bonobo 写入绝对文件路径

转载 作者:行者123 更新时间:2023-11-30 22:18:15 25 4
gpt4 key购买 nike

我使用标准 Bonobo 编写器进行文件输出(CsvWriter 等)。

如果这些传递的是绝对路径('/data/output.csv'),它们将假定它是相对路径,从而触发“找不到资源”错误。

在 Docker 容器中使用 Bonobo 时,这尤其是一个问题,因为写入作为卷安装点的绝对路径是一种常见模式。

让 Bonobo 接受绝对路径的最佳方法是什么?

最佳答案

默认情况下,bonobo 定义了一个名为 fs 的文件系统“服务”,它指向您的本地目录。此服务是 bonobo 核心中提供的所有读取器和写入器使用的默认文件系统。

我会避免将文件位置视为绝对位置,因为这意味着您使软件依赖于特定的文件系统结构。相反,考虑“文件容器”(它恰好是本地文件系统上的目录,但这是一个实现细节),并考虑如何在每个“文件容器”中组织文件。

倭黑猩猩使用PyFilesystem2抽象那些容器。目标是不对系统的任何内容进行硬编码,而是允许在运行时轻松配置数据管道。

您可以定义更多文件系统服务,以在逻辑上将不同路径绑定(bind)到某些业务逻辑。就您而言,假设 /data 是“数据”所在的位置,您可以定义自己的文件系统服务来映射到此目录:

import bonobo

def get_services():
return {
'fs.data': bonobo.open_fs('/data'),
}

def get_graph():
return bonobo.Graph(
bonobo.CsvReader('input.csv', fs='fs.data'),
... # etc
)

...

if __name__ == '__main__':
bonobo.run(get_graph(), services=get_services())

这将允许很好地分离关注点,并将大大增强转换的可移植性。

当然,您也可以覆盖默认文件系统:

import bonobo

def get_services():
return {
'fs': bonobo.open_fs('/data'),
}

你可以定义多个文件系统,有人可能有:

import bonobo

def get_services():
return {
'fs.input': bonobo.open_fs('/input_data'),
'fs.output': bonobo.open_fs('/output_data'),
}

通过将服务定义与实际的图形实现分开,您将能够根据周围的环境(开发笔记本电脑、生产、计算集群等)切换文件系统。例如,它允许在开发环境中使用本地文件,并在生产环境中切换到 AWS S3 存储。

更好的是从环境中读取默认值。

要在 Docker 容器中正常工作,只需定义“数据”文件系统以指向“/data”(或 os.environ.get('DATA_PATH', '/data') ,甚至更好)。然后从这个抽象的文件系统中打开一个本地文件。

希望有帮助!

附注事实上,如果您向阅读器提供绝对路径,它会错误地忽略前导“/”而加入它,这是一个错误,跟踪为 #211 。我认为正确的行为是引发异常。

关于python - 使用 Bonobo 写入绝对文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49428338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com