2010-11-28 145 views
22

ディレクトリに.rarファイルがあるかどうか確認したいと思います。再帰的にする必要はありません。os.path.isfile()でワイルドカードを使用する

os.path.isfile()でワイルドカードを使用するのは私の推測でしたが、動作しません。私は何をすることができますか?

ありがとうございました。

+3

あなたはこの質問への答えを受け入れる必要があります... – GreenAsJade

答えて

2

ワイルドカードはシェルによって展開されているので、あなたは(os.path.isfileでそれを使用することはできません)

ワイルドカードを使用する場合は、popen with shell = Trueまたはos.system()

>>> import os 
>>> os.system('ls') 
aliases.sh   
default_bashprofile  networkhelpers   projecthelper.old   pythonhelpers   virtualenvwrapper_bashrc 
0 
>>> os.system('ls *.old') 
projecthelper.old 
0 

を使用することができますglobモジュールでも同じ効果が得られます。

>>> import glob 
>>> glob.glob('*.old') 
['projecthelper.old'] 
>>> 
49

globが必要です。

>>> import glob 
>>> glob.glob('*.rar') # all rar files within the directory, in this case the current working one 

os.path.isfile()パスは、既存の通常のファイルであればTrueを返します。これは、ファイルがすでに存在し、ワイルドカードをサポートしていないかどうかをチェックするために使用されます。 globです。 os.path.isfile()を使用せずに

+0

+1私は完全な答えを引くしようとしたとき、あなたはそれに私を打ちます。 – pyfunc

+1

残念ながら、os.path.isfile()を使用して結果を確認することなく、ディレクトリやファイルが見つかったかどうかはまだ分かりません。 –

2
import os 
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"] 
4

あなたはglob()によって返される結果は、ファイルやサブディレクトリであるかどうかを知っているので、代わりにこのような何かをしようとしません。

import fnmatch 
import os 

def find_files(base, pattern): 
    '''Return list of files matching pattern in base folder.''' 
    return [n for n in fnmatch.filter(os.listdir(base), pattern) if 
     os.path.isfile(os.path.join(base, n))] 

rar_files = find_files('somedir', '*.rar') 

あなたはまた、単に​​3210によって返される結果をフィルタリングすることができあなたが好きなら、それはユニコードなどに関するいくつかの余分なことをする利点があります。問題がある場合、glob.pyのソースを確認してください。

[n for n in glob(pattern) if os.path.isfile(n)] 
+0

"これに利点があります"と言うと、 'glob'が有利である、あるいは' fnmatch'が利点があるということを意味しますか? –

+1

@リチャードコーデン(ReichardCorden)、グロブが優位性を持っていることを明確にするために改訂しました。 –

0

iglobは、あなたが実際にRARファイルの完全なリストを望んでいないので、ここでグロブよりも良いですが、ただあなただけの少なくとも1つのファイルが存在するかどうかを気にした場合は1つのRARは

+3

これは実際には真実ですが、この回答はより詳細な説明の恩恵を受けるでしょう。違いは、 'iglob'はイテレータを返します。一度呼び出すと何かを返すと、少なくとも1つのマッチがあったことがわかります。 – tripleee

0

が存在することを確認したいですあなたはファイルのリストを望んでいない:

import glob 
import os 

def check_for_files(filepath): 
    for filepath_object in glob.glob(filepath): 
     if os.path.isfile(filepath_object): 
      return True 

    return False 
関連する問題