将URL包装为文件系统路径

时间:2015-05-25 00:36:03

标签: python numpy scipy

我试图将a python function作为参数调用绝对路径,但我想引用的文件在网上。

如果没有在本地克隆文件,有没有办法可以引用文件使python 认为文件是本地文件?

换句话说,我想将URL包装在变量my_file_path中,并将其返回True

os.path.isfile(my_file_path)

请注意,我需要假冒文件系统路径,因为我正在使用的程序中的其他调用期望路径,而不是类似文件的对象(这包括调用the function I linked的其他函数)

2 个答案:

答案 0 :(得分:2)

执行此操作的一个非常好的方法是使用requests库。您可以使用get函数的stream=True选项获取类似文件的对象:

r = requests.get('https://api.github.com/events', stream=True)
loadmat(r.raw, ...)

如果需要实际路径,您也可以使用tempfile模块:

with tempfile.NamedTemporaryFile() as fd:
    r = requests.get('https://api.github.com/events', stream=True)

    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)
    fd.flush()

    loadmat(fd.name)

# other code here, where the temp file no longer exists but the data has been read

答案 1 :(得分:2)

没有办法让Python获取想要路径的URL。

在许多情况下 - 就像你在问题中链接的函数一样 - 它实际上想要一个类似文件的对象,而由urlopen返回的对象就像文件一样。但在其他情况下,这不起作用。

那么,你能做什么?

  1. 在Python级别下,您的操作系统可能有办法安装不同类型的远程路径,就像它们是本地文件系统的一部分一样。
  2. 在更高级别,编写自己的包装器,将文件下载到临时文件中。当然,该临时文件将通过您想要的os.path.isfile(my_file_path)测试,并将与其他需要文件的测试一起使用。但这意味着您需要保留代码的两个“层” - 要处理URL的部分,以及需要处理只能将本地文件分开的函数的部分,并在这些部分之间编写接口层。至少在某些平台上,您可以创建一个永远不会刷新到磁盘的临时文件,除非必要。 (你甚至可以创建一个临时文件,它不会出现在目录树的任何地方,但这在这里没有用,因为那时你显然无法传递路径名...)所以你不是“克隆文件”在任何意义上都是重要的。