12
votes

Vérifiez si je peux écrire un fichier dans un répertoire ou non avec Python

Je dois vérifier si je peux écrire un fichier à un répertoire que l'utilisateur pointe vers avec Python.

Y a-t-il un moyen de vérifier à l'avance? J'utilise peut-être essayer .. Catch à cette fin, mais j'attends quelque chose de mieux en ce sens que je peux vérifier à l'avance.


7 commentaires

Pourquoi attendez-vous quelque chose de mieux? Les exceptions sont bon marché en Python et le moyen de manipulation d'erreurs standard.


@JIM: Merci pour le commentaire, et j'ai élaboré un peu le message.


Les exceptions ne sont pas bon marché en python, mais voient ma réponse pour plus de détails - en particulier, Os.Access et Stat ne vous achètent toujours pas de sécurité réelle et créez une opportunité pour une condition de course. Malgré cela, ils peuvent toujours améliorer l'expérience utilisateur.


@ S.Lott: J'ai modifié la phrase qui a le mot "danger".


Que signifie "mieux"? Vos privilèges utilisateur définissent ce qui est autorisé et non autorisé. Vous pouvez essayer d'écrire une énoncé de fantaisie pour voir si l'utilisateur effectif peut effectuer l'opération - dupliquer efficacement ce que fait le système d'exploitation. Ou vous pouvez simplement l'essayer et gérer l'exception, affectation de la responsabilité envers le système d'exploitation pour faire la vérification. Essayez-vous de dupliquer la vérification des privilèges du système d'exploitation? Pourquoi s'embêter? Quel est le problème avec attraper l'erreur?


@ S.Lott: J'ai dit «mieux» dans le sens où une exception est chère. Et, je n'ai aucun problème à attraper l'erreur, car je le fais fréquemment. J'étais juste curieux s'il y a un moyen d'éviter l'exception. Je peux comprendre ce que vous voulez dire et s'il vous plaît ne soyez pas en colère contre ma tentative d'éviter une exception :)


"Exception est chère" est faux. Les exceptions sont très rapides. Pourquoi les éviter? Pourquoi assumer la responsabilité loin du système d'exploitation? Pourquoi dupliquer la logique déjà présente dans le système d'exploitation pour valider votre demande? "Colère" est votre problème, pas le mien. Je demande juste des questions - pourquoi étiqueter cette "colère"? Pourquoi dupliquer les fonctionnalités du système d'exploitation qui rejetent des demandes inappropriées?


3 Réponses :


1
votes

La manière pythonique est d'y accéder et de saisir l'exception s'il échoue.

Si vous devez vraiment le vérifier, utilisez OS.Access , mais les résultats ne sont pas toujours tristes, méfiez-vous. des problèmes dans Vista / Win7 avec UAC, par exemple!

Exemple: xxx

Ceci vous dira si vous avez lu accès.


0 commentaires

3
votes

Vous ne trouverez probablement pas quelque chose de meilleur ou plus pythonique. La philosophie de Python est Il est plus facile de demander pardon que la permission .

Vous pouvez utiliser Os.Access si vous le souhaitez. Couplé avec OS.PATH.FILE pour vérifier si Vous avez un fichier et non un répertoire. Il sera probablement vous donnera ce dont vous avez besoin. Le chemin d'exception est beaucoup mieux.


4 commentaires

-1 Pour réitérer la philosophie de Python sans discussion sur la raison pour laquelle la manutention des exceptions est la meilleure solution ici.


@Joe: Je suis lié à la philosophie Python. En outre, c'est une philosophie car elle fonctionne ici et ailleurs dans Python. Il est utile pour la typing de canard par exemple.


Le glossaire Python n'explique pas pourquoi c'est utile cependant; En fait, cela le décrit comme "propre et rapide", et je ne suis pas d'accord fort avec les deux.


@Joe: Je conviens que ce n'est pas rapide. C'est propre à mon avis. Plus important encore, EAFP arrive au problème d'un angle différent pour vous. Votre réponse est "en raison de la condition de course" qui est correcte mais est invariante au langage de programmation. Ma réponse est "Utiliser EAFP" car il est utile pour toutes sortes de choses dans Python , pas seulement à cause de la condition de course. L'OP pourrait trouver les deux réponses utiles de différentes manières.



15
votes

Malgré la réclamation de Jim Brissom, la manipulation des exceptions est pas em> pas cher en python par rapport à "Vérifier puis essayez" des idioms si vous vous attendez à ce que la chose échoue plus de quelques pour cent de temps. (Lire à la fin pour une exception!) Cependant, la principale chose ici est que vous devez vérifier l'exception quand même, car les autorisations peuvent changer entre le chèque et votre écriture:

### !!! This is an example of what not to do!
### !!! Don't do this!
if os.access("test", os.W_OK):
    # And in here, some jerk does chmod 000 test
    open("test", "w").write(my_data)
    # Exception happens despite os.access!


0 commentaires