3

osそのため、モジュールを使用して一般的なバックアップアプリケーションを作成していますpickle。これまで、以下のコードを試して、何かがファイルまたはディレクトリであるかどうかを確認しました(物理的な内容ではなく、文字列入力に基づいて)。

import os, re

def test(path):
    prog = re.compile("^[-\w,\s]+.[A-Za-z]{3}$")
    result = prog.match(path)
    if os.path.isfile(path) or result:
        print "is file"
    elif os.path.isdir(path):
        print "is directory"
    else: print "I dont know"

問題

test("C:/treeOfFunFiles/")
is directory
test("/beach.jpg")
I dont know
test("beach.jpg")
I dont know
test("/directory/")
I dont know

望ましい出力

test("C:/treeOfFunFiles/")
is directory
test("/beach.jpg")
is file
test("beach.jpg")
is file
test("/directory/")
is directory

資力

fileである可能性があるものと である可能性があるものの違いを伝えるために、どの正規表現を使用すればよいdirectoryですか? または、これについて別の方法がありますか?

4

3 に答える 3

5

このosモジュールは、パスがファイルかディレクトリかをチェックするメソッドを提供します。正規表現よりもこのモジュールを使用することをお勧めします。

>>> import os
>>> print os.path.isfile(r'/Users')
False
>>> print os.path.isdir(r'/Users')
True
于 2012-10-17T00:13:57.763 に答える
4

これは誰かを助けるかもしれません。私はまったく同じ必要があり、次の正規表現を使用して、入力文字列がディレクトリ、ファイル、またはそのいずれでもないかどうかをテストしました: 汎用ファイルの場合:

^(\/+\w{0,}){0,}\.\w{1,}$

汎用ディレクトリの場合:

^(\/+\w{0,}){0,}$

したがって、生成された python 関数は次のようになります。

import os, re

def check_input(path):
    check_file = re.compile("^(\/+\w{0,}){0,}\.\w{1,}$")
    check_directory = re.compile("^(\/+\w{0,}){0,}$")
    if check_file.match(path):
        print("It is a file.")
    elif check_directory.match(path):
        print("It is a directory")
    else:
        print("It is neither")

例:

  • check_input("/foo/bar/file.xyz") 出力 -> ファイルです
  • check_input("/foo/bar/directory") が表示されます -> ディレクトリです
  • check_input("Random gibberish") が表示される -> どちらでもない

この入力のセキュリティ層は、Squig 氏が親切にも示してくれたように、組み込み関数 os.path.isfile() および os.path.isdir() によって後で強化される可能性がありますが、この予備テストで多少の節約になると思います。マイクロ秒単位でスクリプトのパフォーマンスを向上させます。

PS: このコードを使用しているときに、広く使用されているダッシュ "-" などの特殊文字がパスに実際に含まれているという大きなユースケースを見逃していることに気付きました。これを解決するために、ランダムな文字である .{0,} を使用してアルファベットのみの単語の要件を指定する \w{0,} を変更しました。これは、解決策というよりも回避策です。しかし、それは私が今持っているすべてです。

于 2015-12-16T10:54:45.440 に答える
3

文字クラスでは、存在し、ハイフンを意味する場合-、最初/最後の文字にするか、エスケープして、たとえばに\-変更"^[\w-,\s]+\.[A-Za-z]{3}$"する必要があります。"^[-\w,\s]+\.[A-Za-z]{3}$"

そうでなければ、正規表現を使用して、ファイル名/ディレクトリのように見えるものが無意味かどうかを判断すると思います...

  • /dev/fd0たとえば、ファイルやディレクトリではありません
  • ~/comm.pipeファイルのように見えるかもしれませんが、名前付きパイプです
  • ~/images/test「~/images/holiday/photo1.jpg」というファイルへのシンボリックリンクです

os.pathOSに何が何であるかを尋ねる機能を持つモジュールを  見てください...:

于 2012-10-17T00:14:25.990 に答える