使用Bonob写入绝对文件路径

2024-06-07 11:36:07 发布

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

我使用标准的倭黑猩猩编写器进行文件输出(CsvWriter等)。在

如果传递的是绝对路径('/data/输出.csv'他们将假定它是相对的,因此会触发“找不到资源”错误。在

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

倭黑猩猩接受绝对路径的最佳方式是什么?在


Tags: 文件csvdockerdata标准错误方式模式
1条回答
网友
1楼 · 发布于 2024-06-07 11:36:07

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

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

Bonobo使用PyFilesystem2来抽象这些容器。目标是不要硬编码任何关于系统的东西,而是允许在运行时轻松地配置数据管道。在

您可以定义更多的文件系统服务,将不同的路径逻辑地绑定到某些业务逻辑。在您的例子中,假设/data是“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())

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

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

^{pr2}$

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

import bonobo

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

通过将服务定义与实际的图形实现分离,您将能够根据您周围的env(dev laptop、production、compute cluster,…)来切换文件系统。例如,AWS S3允许在本地存储文件盒上工作。在

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

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

希望有帮助!在

另外,如果你提供了一个读卡器的绝对路径,它会错误地忽略前面的“/”来连接它,这是一个错误,被跟踪为#211。我认为,正确的行为应该是提出一个例外。在

相关问题 更多 >

    热门问题