ファイルfilename
が存在する場合は削除したい。言うのは適切ですか
if os.path.exists(filename):
os.remove(filename)
もっと良い方法はありますか?1行の方法ですか?
unlink
て、名前空間PHPに配置します。
ファイルfilename
が存在する場合は削除したい。言うのは適切ですか
if os.path.exists(filename):
os.remove(filename)
もっと良い方法はありますか?1行の方法ですか?
unlink
て、名前空間PHPに配置します。
回答:
よりpythonicな方法は次のようになります:
try:
os.remove(filename)
except OSError:
pass
これはさらに多くの行を取り、非常に見苦しく見えos.path.exists()
ますが、例外を使いすぎるというPythonの規則への不必要な呼び出しを回避し、従います。
これを行う関数を書くのは価値があるかもしれません:
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()
実行時にファイルが存在しても、実行時に存在するとは限りませんos.remove()
。
TOCTTOUのバグを回避するために、ファイルの存在を確認するのではなく、例外を抑制する方を好みます。Mattの答えはこれの良い例ですが、Python 3では、次のようにして少し単純化できますcontextlib.suppress()
。
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
filename
がpathlib.Path
文字列ではなくオブジェクトの場合、を.unlink()
使用する代わりにそのメソッドを呼び出すことができますos.remove()
。私の経験では、Pathオブジェクトは、ファイルシステム操作では文字列よりも便利です。
この回答のすべてがPython 3専用であるため、アップグレードするもう1つの理由が提供されます。
unlink(2)
はないかと思います。
except
句が必要な場合は、try
/ を使用する必要がありますexcept
。あなたが最初のブロック、ブロック自体、第二のブロックを導入するラインを導入するラインを持っている必要がありますので、それは意味のある、短くすることはできませんし、そのブロックは、それほどtry
/ except
できるだけ簡潔としてすでにあります。
os.path.exists
True
ファイルだけでなくフォルダも返します。os.path.isfile
代わりにを使用して、ファイルが存在するかどうかを確認することを検討してください。
アンディ・ジョーンズの答えの精神で、本物の三項演算はどうですか?
os.remove(fn) if os.path.exists(fn) else None
if os.path.exists(filename): os.remove(filename)
ワンライナーです。
多くの人が反対するかもしれません-多分「醜い」3項の使用を検討するような理由で-しかし、これは私たちが標準でない醜いものを呼ぶときに醜い標準に慣れている人々に耳を傾けるべきかどうかという疑問を投げかけます。
Python 3.4以降のバージョンでは、pythonicの方法は次のようになります。
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
このようなもの?短絡評価を利用します。ファイルが存在しない場合、条件全体がtrueになることはないため、Pythonは2番目の部分の評価を気にしません。
os.path.exists("gogogo.php") and os.remove("gogogo.php")
KISSオファリング:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
その後:
remove_if_exists("my.file")
私はオプションとしてでrm
存在しないファイルを強制的に削除できるを使用--preserve-root
しましたrm
。
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
safe-rm(sudo apt-get install safe-rm
)も使用できます
Safe-rmは、/ bin / rmをラッパーで置き換えることにより、重要なファイルが誤って削除されるのを防ぐことを目的とした安全ツールです。ラッパーは、削除すべきでないファイルとディレクトリの構成可能なブラックリストに対して特定の引数をチェックします。
まず、フォルダ/ファイルのパスが存在するかどうかを確認します。これにより、変数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
安全に使用し、防止するための回答を追加しましたrm -r /
。@JonBrave
rm -f --preserve-root
十分ではありません(--preserve-root
とにかくおそらくデフォルトです)。私は-r /
例として挙げましたが、それが何かだったら-r /home
どうでしょうか?あなたはおそらく望んrm -f -- $fileToRemove
でいるが、それはポイントではありません。
os.system('rm ...')
は非常に危険です。