ola*_*ndo 179 python path relative-path
我们正在使用一个代码存储库,它部署在Windows和Linux上 - 有时在不同的目录上.项目中的一个模块应该如何引用项目中的一个非Python资源(CSV文件等)?
如果我们做类似的事情:
thefile=open('test.csv')
Run Code Online (Sandbox Code Playgroud)
要么:
thefile=open('../somedirectory/test.csv')
Run Code Online (Sandbox Code Playgroud)
仅当脚本从一个特定目录或目录的子集运行时,它才会起作用.
我想做的是:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?可能吗?
c08*_*089 240
尝试使用相对于当前文件路径的文件名.'./my_file'的示例:
fn = os.path.join(os.path.dirname(__file__), 'my_file')
Run Code Online (Sandbox Code Playgroud)
在Python 3.4+中,您还可以使用pathlib:
fn = pathlib.Path(__file__).parent / 'my_file'
Run Code Online (Sandbox Code Playgroud)
Sha*_*mas 39
如果您正在使用安装工具或分发(setup.py安装),那么访问这些打包资源的"正确"方式似乎是使用package_resources.
在你的情况下,例子是
import pkg_resources
my_data = pkg_resources.resource_string(__name__, "foo.dat")
Run Code Online (Sandbox Code Playgroud)
当然,读取资源和读取的二进制数据当然是my_data的值
如果您只需要文件名,也可以使用
resource_filename(package_or_requirement, resource_name)
Run Code Online (Sandbox Code Playgroud)
例:
resource_filename("MyPackage","foo.dat")
Run Code Online (Sandbox Code Playgroud)
优点是,即使它是像鸡蛋一样的存档分发,它也能保证工作.
请参阅http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
sky*_*ree 16
在Python中,路径是相对于当前工作目录的,在大多数情况下,这是您运行程序的目录.在当前的工作目录很可能不是同你的模块文件的目录,因此,使用相对于当前的模块文件的路径始终是一个不错的选择.
使用绝对路径应该是最佳解决方案:
import os
package_dir = os.path.dirname(os.path.abspath(__file__))
thefile = os.path.join(package_dir,'test.cvs')
Run Code Online (Sandbox Code Playgroud)
use*_*673 13
我经常使用类似的东西:
import os
DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'datadir'))
# if you have more paths to set, you might want to shorten this as
here = lambda x: os.path.abspath(os.path.join(os.path.dirname(__file__), x))
DATA_DIR = here('datadir')
pathjoin = os.path.join
# ...
# later in script
for fn in os.listdir(DATA_DIR):
f = open(pathjoin(DATA_DIR, fn))
# ...
Run Code Online (Sandbox Code Playgroud)
变量
__file__
Run Code Online (Sandbox Code Playgroud)
保存您编写该代码的脚本的文件名,这样您就可以创建相对于脚本的路径,但仍然使用绝对路径编写.由于以下几个原因,它运作良好:
但是你需要注意平台兼容性 - Windows的os.pathsep与UNIX不同.
import os
cwd = os.getcwd()
path = os.path.join(cwd, "my_file")
f = open(path)
Run Code Online (Sandbox Code Playgroud)
您还尝试规范您的cwd使用os.path.abspath(os.getcwd()).更多信息在这里.
| 归档时间: |
|
| 查看次数: |
174900 次 |
| 最近记录: |