12

ユーザーがPythonで指すディレクトリにファイルを書き込めるかどうかを確認する必要があります。

事前に確認する方法はありますか?私はこの目的のためにtry..catchを使用しているかもしれませんが、事前に確認できるという意味で、より良いものを期待しています。

4

3 に答える 3

15

Jim Brissomの主張にもかかわらず、Pythonでの例外処理は、「チェックしてから試す」イディオムと比較して、数パーセント以上失敗することが予想される場合は安価ではありません。(例外については最後まで読んでください!)ただし、ここで重要なのは、チェックと書き込みの間で権限が変わる可能性があるため、とにかく例外をチェックする必要があるということです。

### !!! 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!

os.accessとstatモジュールは、たとえば、ユーザーが選択できるフォルダーのリストを準備し、無効なフォルダーを事前に除外したい場合に最適です。ただし、ゴムが道路にぶつかった場合、プログラムを堅牢にしたい場合は、例外処理の代わりにはなりません。

そして今、exceptions-are-slowルールの例外:例外は遅いですが、ディスクは遅いです。また、ディスクに特に大きな負荷がかかっている場合は、os.accessとopen呼び出しの間に、関心のあるファイルがOSまたはディスクキャッシュから削除される可能性があります。この場合、ディスク(そして最近では、ネットワークを意味することもあります)に2回アクセスする必要があるため、大幅な速度低下が発生します。

于 2010-09-12T19:03:28.350 に答える
3

あなたはおそらくもっと良いものやもっとPythonicなものを見つけることはないでしょう。Pythonの哲学は、許可よりも許しを求める方が簡単であるということです。

必要に応じて、 os.accessを使用できます。os.path.isfileと組み合わせて、ディレクトリではなくファイルがあるかどうかを確認します。それはおそらくあなたが必要なものをあなたに与えるでしょう。例外パスははるかに優れています。

于 2010-09-12T18:50:44.980 に答える
1

pythonicの方法は、それにアクセスし、失敗した場合に例外をキャッチすることです。

本当に確認する必要がある場合は、を使用してくださいos.access。ただし、結果が常に正しいとは限りません。たとえば、UACを使用したVista/Win7の問題に注意してください。

例:

os.access(r'C:\Programme', os.R_OK)

これにより、読み取りアクセス権があるかどうかがわかります。

于 2010-09-12T18:48:52.513 に答える