嗨,我正在使用python包装.我有3个非代码文件,即[‘synonyms.csv’,’acronyms.csv’,’words.txt’].
>这些文件存在于文件夹结构Wordproject / WordProject / Repository / DataBank /
>我在路径Wordproject / WordProject / Repository /上有一个RepositoryReader类
>我编写了一个代码,用于提取RepositoryReader的当前位置,然后查找名为DataBank的子目录,并在那里查找3个文件.
问题是当我从代码中创建一个鸡蛋,然后运行它,
我的代码给了我错误:
Could not find the file at X:\1. Projects\Python\Wordproject\venv\lib\site-packages\Wordproject-1.0-py3.6.egg\Wordproject\Repository\DataBank\synonyms.csv
如果路径是鸡蛋,它无法获取文件或从路径读取文件.它有什么办法吗?这些文件必须在鸡蛋中.
解决方法:
您可以尝试在此处执行两项不同的操作:
>将数据文件视为包的一部分,如Python模块,并在运行时访问它们,就像您的包是普通的目录树一样,即使它不是.
>将数据文件安装在pip安装时的其他位置,安装到您可以正常访问的位置.
两者都在the section on data files的PyPA / setuptools文档中进行了解释.我想你想要第一个,这在Accessing Data Files at Runtime的小节中有所涉及:
Typically, existing programs manipulate a package’s
__file__
attribute in order to find the location of data files. However, this manipulation isn’t compatible with PEP 302-based import hooks, including importing from zip files and Python Eggs. It is strongly recommended that, if you are using data files, you should use the 07002 ofpkg_resources
to access them. Thepkg_resources
module is distributed as part ofsetuptools
, so if you’re usingsetuptools
to distribute your package, there is no reason not to use its resource management API. See also 07003 for a quick example of converting code that uses__file__
to usepkg_resources
instead.
按照这个链接,你会发现看起来像一些狡猾的老PEAK文档,但这只是因为他们真的是狡猾的旧PEAK文档.有一个version buried inside the setuptools
docs,一旦你找到它,你会发现它更容易阅读和导航.
正如它所说,你可以尝试使用get_data(它将在egg / zip中工作),然后回退到访问文件(从源代码运行时可以工作),但你最好使用pkg_resources中的包装器.基本上,如果你的代码是这样做的:
path = os.path.join(__file__, 'Wordproject/WordProject/Repository/DataBank/', datathingy)
with open(path) as f:
for line in f:
do_stuff(line)
…你会改变它:
path = 'Wordproject/WordProject/Repository/DataBank/' + datathingy
f = pkg_resources.resource_stream(__name__, path)
for line in f:
do_stuff(line.decode())
请注意,resource_stream文件始终以二进制模式打开.因此,如果您想将它们作为文本读取,则需要围绕它们包装TextIOWrapper,或者解码每一行.