存在しない可能性のあるファイルを削除するための最もpythonicな方法


ファイルfilenameが存在する場合は削除します。 言うべきことは適切ですか?

if os.path.exists(filename):
    os.remove(filename)

より良い方法がありますか? 一行の方法ですか?



Answers



より平凡な方法は次のようになります:

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



TOCTTOUのバグを避けるために、ファイルの存在をチェックするのではなく、例外を抑制することを好みます。 Mattの答えはこれの良い例ですが、 contextlib.suppress()を使ってPython 3の下で少し簡単にすることができます:

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove(filename)

filenameが文字列ではなくpathlib.Pathオブジェクトの場合、 .unlink()を使用する代わりに.unlink()メソッドを呼び出すことができます。 私の経験上、Pathオブジェクトはファイルシステムの操作のために文字列よりも便利です。

この回答のすべてがPython 3に限定されているため、アップグレードするもう一つの理由があります。




os.path.existsは、フォルダとファイルに対してTrueを返します。 os.path.isfileを使用して、ファイルが存在するかどうかを確認してください。




アンディ・ジョーンズの答えの精神の中で、本物の三項演算についてはどうですか?

os.remove(fn) if os.path.exists(fn) else None



ファイルが存在するかどうかを知り、それを削除する別の方法は、モジュールglobを使用することです。

from glob import glob
import os

for filename in glob("*.csv"):
    os.remove(filename)

Globは、* nixワイルドカードでパターンを選択できるすべてのファイルを見つけ、リストをループします。




if os.path.exists(filename): os.remove(filename)

1ライナーです。

おそらく、三者の使用を「醜い」と考えるような理由から、あなたの意見が一致しないかもしれませんが、非標準的な「醜い」ものを呼び出すときに醜い基準に慣れた人々の話を聞かなければならないのかという疑問があります。




このようなもの? 短絡評価を利用します。 ファイルが存在しない場合、条件全体が真となることはありません。したがって、Pythonは2番目の部分の評価を邪魔しません。

os.path.exists("gogogo.php") and os.remove("gogogo.php")



Mattの回答は、古いPythonsの場合は正しいもの、新しいものの場合はKevinの正解です。

silentremoveの関数をコピーしない場合、この機能はpath.pyのremove_pとして公開されています

from path import Path
Path(filename).remove_p()



私はちょうどシャットルを使用する

import shutil shutil.rmtree(filename, ignore_errors=True)




os.removeはうまく動作するはずです。

import os
Input = input('File:')
File = Input.get()
try:
  os.remove(File)
except:
  none