563

ファイルが存在する場合は削除したいfilename。言うのが妥当か

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

より良い方法はありますか?一行道?

4

12 に答える 12

748

よりPython的な方法は次のようになります。

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
于 2012-05-31T20:10:42.817 に答える
223

TOCTTOUバグを回避するために、ファイルの存在をチェックするよりも、例外を抑制することを好みます。マットの答えはこれの良い例ですが、Python 3 では以下を使用して少し単純化できますcontextlib.suppress()

import contextlib

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

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

この回答のすべてが Python 3 専用であるため、アップグレードするもう 1 つの理由になります。

于 2014-11-20T16:49:55.593 に答える
53

os.path.existsTrueファイルだけでなくフォルダも返します。os.path.isfile代わりに、を使用してファイルが存在するかどうかを確認することを検討してください。

于 2012-05-31T20:09:44.557 に答える
45

アンディ・ジョーンズの答えの精神で、本物の三項演算はどうですか:

os.remove(fn) if os.path.exists(fn) else None
于 2014-01-14T00:02:39.800 に答える
8

ファイル (または複数のファイル) が存在するかどうかを確認し、それを削除する別の方法は、モジュール glob を使用することです。

from glob import glob
import os

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

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

于 2014-10-23T11:51:55.670 に答える
2

このようなもの?短絡評価を利用します。ファイルが存在しない場合、条件全体を真にすることはできないため、Pythonは2番目の部分をわざわざ評価しません。

os.path.exists("gogogo.php") and os.remove("gogogo.php")
于 2012-05-31T20:12:15.847 に答える