开发者

Use wildcard with os.path.isfile()

I'd like to check if there are any .rar files in a directory. It doesn’t need to be recursive.

Using wildcard with os.path.isfile() was my best guess, but it doesn't work. W开发者_运维问答hat can I do then?


glob is what you need.

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

os.path.isfile() returns True if a path is an existing regular file. So that is used for checking whether a file already exists and doesn't support wildcards. glob does.


Without using os.path.isfile() you won't know whether the results returned by glob() are files or subdirectories, so try something like this instead:

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')

You could also just filter the results returned by glob() if you like, and that has the advantage of doing a few extra things relating to unicode and the like. Check the source in glob.py if it matters.

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


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


Wildcards are expanded by shell and hence you can not use it with os.path.isfile()

If you want to use wildcards, you could use popen with shell = True or 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

You could get the same effect with glob module too.

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


If you just care about whether at least one file exists and you don't want a list of the files:

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


to display full path and filter based on extension,

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


Just another method to get the job done using subprocess.

import subprocess

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

Reference : https://docs.python.org/2/library/subprocess.html#subprocess.check_output


iglob is better than glob here since you do not actually want the full list of rar files, but just want to check that one rar exists

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜