0

私はPython2.7で、リモートファイルを取得し、ユーザーが指定できるディレクトリにそれらをダンプするプログラムを作成しています。現在、プログラムが実際にそのディレクトリに書き込めることを確認するために、次のことを行います(dumpdirがチェックするディレクトリの名前を含む文字列であると仮定します)。

try:
    os.mkdir(dumpdir+'/.mwcrawler')
    os.rmdir(dumpdir+'/.mwcrawler')
except:
    logging.error('Could not open %s for writing, using default', dumpdir)

しかし、これは私の通常のコードよりもさらにハックな感じがします。これについて行く正しい方法は何ですか?多分特権に関するある種の主張?

4

2 に答える 2

2

This link describes the usage of os.access, a method specifically created for your needs.

It also explains a better way of approaching rights checking.

As also rightfully mentioned in comments, os.access will have issues in a few specific cases, so just to be totally sure, "hit-n-run" approach is actually better, try writing, catch exception, see what happened - go from there.

于 2013-01-29T03:02:46.263 に答える
2

一般に、許可よりも許しを求める方がよいでしょう。とにかく各ファイルを書き込む際のエラーを処理する必要があるので、なぜ事前に確認するのでしょうか。

ただし、ユーザーインターフェイス(コマンドラインインターフェイスでも、書き込みを開始するずっと前にprefsファイルを読み取ることができる)がある場合は、ユーザーができるだけ早くエラーを返す方がはるかに便利なことがよくあります。それがこのチェックを行う唯一の理由である限り、問題はありません。

ただし、チェックの方法を改善する方法はたくさんあります。

まず、何も指定せずに使用することはほとんどありませんexcept:。これはPythonのさまざまなバージョンでさまざまなことをキャッチする(したがって、他のバージョンに慣れている人間の読者を混乱させる)という事実に加えて、書き込み不可、不正なUnicode文字、またはコードのタイプミスを区別する方法がないことを意味します。

さらに、書き込みができない場合、エラーメッセージには「読み取り不可」と表示されますが、これはかなり奇妙なことです。

第二に、誰も名前の付いたファイルを持っていないことが確実でない限り.mwcrawler(たとえば、または何かで始まるファイルの転送を拒否したため'.')、固定名を使用することは単に問題を引き起こします。より良い解決策は、例えば、を使用することtempfile.mkdtempです。

また、移植性を持たせたい場合は、パスに文字列操作を使用しないようにする必要があります。それがos.path(そしてより高レベルのユーティリティ)の目的です。したがって、WindowsやzOSなどについて学習したり考えたりする必要はありません。

すべてを一緒に入れて:

try:
    d = tempfile.mkdtemp(prefix='.mwcrawler', dir=dumpdir)
except Exception as e:
    logging.error('Could not open %s for reading (%s), using default', dumpdir, e)
else:
    os.rmdir(d)
于 2013-01-29T03:06:59.397 に答える