web-dev-qa-db-ja.com

os.path.isfile()でワイルドカードを使用します

ディレクトリに.rarファイルがあるかどうかを確認したいと思います。再帰的である必要はありません。

Os.path.isfile()でワイルドカードを使用するのが最善の推測でしたが、機能しません。それで私は何ができますか?

ありがとう。

30
Alex

glob が必要です。

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

os.path.isfile()は、パスが既存の通常ファイルの場合、Trueを返します。そのため、ファイルが既に存在するかどうかを確認するために使用され、ワイルドカードをサポートしていません。 globは。

65
user225312

os.path.isfile() を使用しないと、 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')
_

また、必要に応じてglob()によって返される結果をフィルタリングすることもできます。これには、Unicodeなどに関連するいくつかの追加の処理を行うという利点があります。問題があればglob.pyのソースを確認してください。

_[n for n in glob(pattern) if os.path.isfile(n)]
_
7
Peter Hansen

ワイルドカードはシェルによって展開されますしたがって、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']
>>> 
_
3
pyfunc
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and  x[-4:] == ".rar"]
3
Mariy

少なくとも1つのファイルが存在するかどうかだけに関心があり、ファイルのリストが必要ない場合:

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
1
Tchotchke

サブプロセスを使用してジョブを完了する別の方法。

import subprocess

try:
        q = subprocess.check_output('ls')
        if ".rar" in q:
             print "Rar exists"
except subprocess.CalledProcessError as e:
        print e.output

リファレンス: https://docs.python.org/2/library/subprocess.html#subprocess.check_output

0
SUUSHEN_SENJU

iglobは、実際にはrarファイルの完全なリストが必要ではなく、1つのrarが存在することを確認するだけなので、globよりも優れています

0
gnetscher

拡張子に基づいてフルパスとフィルターを表示するには、

import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and  f[-5:] == ".json" and isfile(join(file, f))]
0
Som