Je souhaite supprimer le fichier filename
s'il existe. Est-il approprié de dire
if os.path.exists(filename):
os.remove(filename)
Y a-t-il une meilleure façon? Un moyen sur une ligne?
unlink
et placez-la dans l'espace de noms PHP.
Je souhaite supprimer le fichier filename
s'il existe. Est-il approprié de dire
if os.path.exists(filename):
os.remove(filename)
Y a-t-il une meilleure façon? Un moyen sur une ligne?
unlink
et placez-la dans l'espace de noms PHP.
Réponses:
Une manière plus pythonique serait:
try:
os.remove(filename)
except OSError:
pass
Bien que cela prenne encore plus de lignes et semble très moche, cela évite l'appel inutile os.path.exists()
et suit la convention python de surutilisation des exceptions.
Il peut être utile d'écrire une fonction pour ce faire:
import os, errno
def silentremove(filename):
try:
os.remove(filename)
except OSError as e: # this would be "except OSError, e:" before Python 2.6
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occurred
os.path.exists()
est exécuté ne signifie pas qu'il existe lorsqu'il os.remove()
est exécuté.
Je préfère supprimer une exception plutôt que de vérifier l'existence du fichier, pour éviter un bug TOCTTOU . La réponse de Matt en est un bon exemple, mais nous pouvons la simplifier légèrement sous Python 3, en utilisant contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Si filename
est un pathlib.Path
objet au lieu d'une chaîne, nous pouvons appeler sa .unlink()
méthode au lieu d'utiliser os.remove()
. D'après mon expérience, les objets Path sont plus utiles que les chaînes pour la manipulation du système de fichiers.
Étant donné que tout dans cette réponse est exclusif à Python 3, il fournit une autre raison de mettre à niveau.
unlink(2)
, qui est de loin la plus ancienne interface pertinente ici.
except
clause, vous devez utiliser try
/ except
. Il ne peut pas être raccourci de manière significative, car vous devez avoir une ligne pour introduire le premier bloc, le bloc lui-même, une ligne pour introduire le deuxième bloc, puis ce bloc, donc try
/ except
est déjà aussi concis que possible.
os.path.exists
renvoie True
pour les dossiers ainsi que les fichiers. Pensez à utiliser os.path.isfile
pour vérifier si le fichier existe à la place.
Dans l'esprit de la réponse d'Andy Jones, que diriez-vous d'une authentique opération ternaire:
os.remove(fn) if os.path.exists(fn) else None
Depuis Python 3.8, utilisez missing_ok=True
et pathlib.Path.unlink
( docs ici )
from pathlib import Path
my_file = Path("./dir1/dir2/file.txt")
# Python 3.8+
my_file.unlink(missing_ok=True)
# Python 3.7 and earlier
if my_file.exists():
my_file.unlink()
Une autre façon de savoir si le fichier (ou les fichiers) existe et de le supprimer est d'utiliser le module glob.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob trouve tous les fichiers qui pourraient sélectionner le modèle avec un caractère générique * nix et boucle la liste.
La réponse de Matt est la bonne pour les anciens Pythons et Kevin pour les plus récents.
Si vous ne souhaitez pas copier la fonction pour silentremove
, cette fonctionnalité est exposée dans path.py en tant que remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
est une doublure.
Beaucoup d'entre vous ne sont peut-être pas d'accord - peut-être pour des raisons telles que le fait de considérer l'utilisation proposée des ternaires comme "laide" - mais cela soulève la question de savoir si nous devons écouter les gens habitués à des normes moches lorsqu'ils appellent quelque chose de non standard "laid".
Dans Python 3.4 ou version ultérieure, la méthode pythonique serait:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Quelque chose comme ça? Profite de l'évaluation des courts-circuits. Si le fichier n'existe pas, le conditionnel entier ne peut pas être vrai, donc python ne dérangera pas l'évaluation de la deuxième partie.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Une offre KISS:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
Et alors:
remove_if_exists("my.file")
Une autre solution avec votre propre message en exception.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
J'ai utilisé rm
ce qui peut forcer la suppression de fichiers inexistants avec --preserve-root
comme option pour rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Nous pouvons également utiliser safe-rm ( sudo apt-get install safe-rm
)
Safe-rm est un outil de sécurité destiné à empêcher la suppression accidentelle de fichiers importants en remplaçant / bin / rm par un wrapper, qui vérifie les arguments donnés par rapport à une liste noire configurable de fichiers et de répertoires qui ne doivent jamais être supprimés.
Je vérifie d'abord si le chemin du dossier / fichier existe ou non. Cela empêchera de définir la variable fileToRemove /
folderToRemove to the string
-r / `.
import os, subprocess
fileToRemove = '/home/user/fileName';
if os.path.isfile(fileToRemove):
subprocess.run(['rm', '-f', '--preserve-root', fileToRemove]
subprocess.run(['safe-rm', '-f', fileToRemove]
rm
toute sécurité et prévenir rm -r /
. @JonBrave
rm -f --preserve-root
n'est pas assez bon ( --preserve-root
c'est probablement la valeur par défaut de toute façon). J'ai donné -r /
comme exemple , que faire si c'est -r /home
ou quoi? Vous voulez probablement rm -f -- $fileToRemove
, mais ce n'est pas le but.
os.system('rm ...')
est extrêmement dangereux, désolé.