J'écris un script Python qui doit valider l'existence d'un fichier. Le fichier peut être un chemin d'accès complet comme /home/xxx/file.txt ou une URL http://company.com/xxx/file.txt.

Existe-t-il une méthode python qui peut valider l'existence de différents schémas de chemin?

1
TieDad 9 mars 2016 à 04:29

3 réponses

Meilleure réponse

Que comptez-vous faire avec le fichier?

Si vous devez utiliser le fichier, vous feriez mieux de l'ouvrir, de peur qu'il ne disparaisse avant de l'utiliser. Il peut y avoir des problèmes de sécurité si vous testez d'abord puis ouvrez, car les deux opérations ne peuvent pas être rendues atomiques. Il est possible que le fichier soit supprimé, créé ou autrement perturbé avant que votre code ne l'ouvre.

Si vous voulez simplement savoir si un chemin existe au moment où vous le testez, utilisez os.path.exists(). Sinon, si vous voulez réellement faire quelque chose avec le fichier, appelez open() dessus.

Pour les URL, vous devez y accéder ... soit OBTENEZ-LE avec urlopen() ou utilisez requests. Vous pouvez également essayer d'envoyer une demande HEAD pour déterminer si une ressource existe sans télécharger son contenu. Ceci est utile si vous vérifiez une ressource qui renvoie beaucoup de données, comme une image ou un fichier musical. Le module requests vous facilite la tâche:

import requests

r = requests.head(url, allow_redirects=True)
if r.status_code == 200:
    # resource apparently exists

Le allow_redirects est nécessaire pour les requêtes HEAD, par ex.

import requests

url = 'http://www.google.com'
r = requests.head(url)
print(r.status_code)
# 302
r = requests.head(url, allow_redirects=True)
print(r.status_code)
# 200
3
mhawke 9 mars 2016 à 02:07

Voici ce que j'ai utilisé par le passé pour gérer la vérification de l'existence d'une URL, mais si vous recherchez simplement un fichier, utilisez les méthodes suggérées dans vos commentaires.

import requests
    request = requests.get('http://company.com/')
    if request.status_code == 200:
        print('We are dandy.')
    else:
        print('No existe.')
1
TheDmOfJoes 9 mars 2016 à 01:42

Je réponds à la question que vous n'avez pas posée et vous dis: ne faites pas ça.

Vous voulez rarement valider simplement l'existence, car généralement, si elle existe, vous voulez l'utiliser. La vérification, puis l'ouverture est un modèle ouvert aux conditions de concurrence (vous vérifiez, le fichier existe, un autre programme le supprime, vous essayez de l'ouvrir pour la lecture, kaboom). En règle générale, la bonne façon de vérifier si un fichier (ou toute autre ressource que vous souhaitez utiliser) est disponible est d'essayer de l'ouvrir et de gérer l'exception s'il s'avère qu'il n'existe pas.

Le modèle général est appelé EAFP (plus facile de demander pardon que de demander une autorisation) et il est beaucoup plus sûr pour des activités sujettes à la course comme celle-ci que le modèle opposé que vous essayez d'utiliser, LBYL (regardez avant de sauter).

Donc, si vous voulez vérifier si un fichier existe, appelez open dessus. Si vous souhaitez vérifier si une URL existe, essayez de urlopen la. Cela ne fait pas que valider l'existence, il vous permet également de savoir des choses importantes comme "est-ce une chose semblable à un fichier?", "Ai-je la permission de lire le contenu?", Etc. qui autrement nécessite de vérifier plusieurs indicateurs et peut encore vous donner la mauvaise réponse si vous posez la question de manière incorrecte (par exemple, il importe rarement s'il s'agit d'un fichier, tant que vous pouvez y lire des données, mais la vérification de isfile exclut les éléments comme, par exemple, les canaux nommés créés par {{ X3}} substitution de processus qui agissent principalement comme des fichiers).

0
ShadowRanger 9 mars 2016 à 01:59