代码之家  ›  专栏  ›  技术社区  ›  Chris

如何在项目中固有地导入文本或配置文件的内容?

  •  0
  • Chris  · 技术社区  · 4 年前

    我尝试了以下方法 __init__.py 文件,认为它将根据导入时的位置进行评估:

    # /../../proj_dir_foo/__init__.py
    # opens file: .../proj_dir_foo/foo.csv
    
    import pandas as pd
    settings = pd.read_csv('foo.csv')
    

    从另一个文件中:

    from foo.bar.proj_dir_foo import settings
    

    产量: FileNotFoundError


    但这真的不方便。我不是在积累更容易修改的配置文件,而是在积累源代码 proj_dir_foo 其存储配置信息。

    它出现在源代码中的唯一原因是,有一个项目模块知道根目录中充满配置的资源或材料文件夹的位置 从技术上讲不是 " 模块 “。相反,它是机器中的一个集成齿轮。或者,更确切地说,是一个我不再容易重构的东西。


    如何在python项目中模块化任意配置文件?

    0 回复  |  直到 4 年前
        1
  •  0
  •   9000    4 年前

    脚本的当前目录是启动脚本的目录。 import os; print(os.getcwd()) 我会告诉你的。

    如果你想打开一个相对于代码位于某个位置的文件,你有几个选择。

    使用 sys.argv[0] 获取脚本的路径;使用 path.dirname() 从中提取目录,以及 path.join() 创建特定文件的路径:

    # some script.
    import json, sys, path
    
    my_path = path.dirname(sys.argv[0])
    cfg_path = path.join(my_path, 'config', 'settings.json')
    with open(my_path) as cfg_file:
      my_settings = json.load(cfg_file)
    

    或者,如果您导入一个模块,您可以使用其 __file__ 属性,了解您从哪里导入它,并用于定位配置:

    # some script.
    import path
    import foo.bar.baz
    
    baz_cfg_path = path.join(path.dirname(foo.bar.baz.__file__), 'baz.cfg')