Je cherche une recette générale pour utiliser une URL pour une fonction qui attend un nom de fichier. J'en ai laissé perplexe, mais c'est un peu complexe et facile de se tromper.Comment fournir l'URL à la fonction nécessitant un nom de fichier en Python
Dans ce cas, ma fonction est read_file
de geopandas
, mais ce serait le même problème dans tous les cas.
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)
qui fonctionne et ne semble pas trop terrible, mais je devais expérimenter un tas de trouver, parce que de légères variantes soulèvent OSError: no such file or directory
, en raison de la durée de vie tempfiles; Pourtant, je ne veux pas non plus encombrer le système de fichiers avec des fichiers permanents.
Cela échoue:
def as_file(url):
tfile = tempfile.NamedTemporaryFile()
tfile.write(requests.get(url).content)
return tfile.name
gpd.read_file(as_file(URL))
et même ceci:
def as_file(url):
tfile = tempfile.NamedTemporaryFile()
tfile.write(requests.get(url).content)
return tfile
gpd.read_file(as_file(URL).name)
Y at-il une manière plus évidente, mémorable, ou l'épreuve des balles?
Vous pouvez utiliser [ 'contextlib.contextmanager'] (https://docs.python.org/2/library/contextlib.html#contextlib.contextmanager), et 'wit h'. Désolé pas le temps de fournir une meilleure réponse. –