从 python 蛋访问文件

iam*_*rot 7 python egg

嗨,我正在使用 python 包装。我有 3 个non-code文件,即['synonyms.csv', 'acronyms.csv', 'words.txt'].

  • 这些文件存在于文件夹结构中 Wordproject/WordProject/Repository/DataBank/
  • RepositoryReader在路上有一堂课Wordproject/WordProject/Repository/
  • 我已经编写了一个代码,可以拉出 的当前位置,RepositoryReader然后查找一个subdirectory被调用DataBank的文件并在那里查找 3 个文件。

问题是当我创建一个egg代码,然后运行它时,

我的代码给了我错误:

在 X:\1 找不到文件。Projects\Python\Wordproject\venv\lib\site-packages\Wordproject-1.0-py3.6.egg\Wordproject\Repository\DataBank\synonyms.csv

如果路径是鸡蛋,则无法获取文件或从路径中读取文件。有什么办法可以解决吗?这些文件必须在egg.

aba*_*ert 1

您可以在这里尝试做两件不同的事情:

\n\n
    \n
  • 将数据文件视为包的一部分,就像 Python 模块一样,并在运行时访问它们,就像包是普通目录树一样,即使它不是。
  • \n
  • 将数据文件安装在其他地方pip install,放在您可以正常访问的位置。
  • \n
\n\n

PyPA/ 文档中有关数据文件的部分对两者进行了解释setuptools我想你想要这里的第一个,它在“在运行时访问数据文件”小节中介绍:

\n\n
\n

通常,现有程序会操作 package\xe2\x80\x99s__file__属性来查找数据文件的位置。但是,此操作与基于 PEP 302 的导入挂钩(包括从 zip 文件和 Python Egg 导入)\xe2\x80\x99 不兼容。强烈建议,如果您使用数据文件,则应使用ResourceManager APIpkg_resources访问它们。该pkg_resources模块作为 的一部分进行分发setuptools,因此如果您\xe2\x80\x99 用于setuptools分发包,则没有理由不使用其资源管理 API。另请参阅访问包资源__file__以获取将 use 转换为 use的代码的快速示例pkg_resources

\n
\n\n

点击该链接,您会发现一些看起来像一些粗俗的旧 PEAK 文档,但这只是因为它们确实是粗俗的旧 PEAK 文档。文档中隐藏着一个版本setuptools,一旦您设法找到它,您可能会发现它更易于阅读和导航。

\n\n

正如它所说,您可以 try使用get_data(这将在 Egg/zip 中工作),然后回退到访问文件(这将在从源代码运行时工作),但是您最好使用pkg_resources. 基本上,如果您的代码执行此操作:

\n\n
path = os.path.join(__file__, \'Wordproject/WordProject/Repository/DataBank/\', datathingy)\nwith open(path) as f:\n    for line in f:\n        do_stuff(line)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 你将其更改为:

\n\n
path = \'Wordproject/WordProject/Repository/DataBank/\' + datathingy\nf = pkg_resources.resource_stream(__name__, path)\nfor line in f:\n    do_stuff(line.decode())\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,resource_stream文件始终以二进制模式打开。因此,如果您想将它们作为文本读取,则需要将TextIOWrapper它们包裹起来,或者对每一行进行解码。

\n