如何为Python中需要文件名的函数提供URL

问题描述 投票:2回答:1

我正在寻找一个通用配方来使用URL来获取需要文件名的函数。我已经困惑了一个,但它有点复杂,很容易出错。

在这种情况下,我的函数是来自read_filegeopandas,但无论如何它都是同样的问题。

import tempfile, requests
import geopandas as gpd

def as_file(url):
    tfile = tempfile.NamedTemporaryFile()
    tfile.write(requests.get(url).content)
    return tfile

URL = 'https://raw.githubusercontent.com/bowmanmc/ohiorepresents/master/data/congressional.min.json'
tf = as_file(URL)
gpd.read_file(tf.name)

这是有效的,并且看起来并不太糟糕,但我不得不尝试一堆才能找到它,因为由于临时文件的使用寿命,轻微的变种会引发OSError: no such file or directory;但我也不想用永久文件来混淆文件系统。

这失败了:

def as_file(url):
    tfile = tempfile.NamedTemporaryFile()
    tfile.write(requests.get(url).content)
    return tfile.name

gpd.read_file(as_file(URL))

甚至这个:

def as_file(url):
    tfile = tempfile.NamedTemporaryFile()
    tfile.write(requests.get(url).content)
    return tfile

gpd.read_file(as_file(URL).name)

是否有更明显,令人难忘或防弹的方式?

python url arguments filenames
1个回答
2
投票

您可以使用上下文管理器来管理临时文件的生命周期:

from contextlib import contextmanager

@contextmanager
def as_file(url):
    with tempfile.NamedTemporaryFile() as tfile:
        tfile.write(requests.get(url).content)
        tfile.flush()
        yield tfile.name

注意:with NamedTemporaryFile() as tfile只适用于Python 3.否则你必须确保它自己为Python 2正确清理。

用法:

with as_file(URL) as filename:
    gpd.read_file(filename)
© www.soinside.com 2019 - 2024. All rights reserved.