How to find all files with a particular extension?

Question:

I am trying to find all the .c files in a directory using Python.

I wrote this, but it is just returning me all files – not just .c files:

import os
import re

results = []

for folder in gamefolders:
    for f in os.listdir(folder):
        if re.search('.c', f):
            results += [f]

print results

How can I just get the .c files?

Asked By: BeeBand

||

Answers:

for _,_,filenames in os.walk(folder):
    for file in filenames:
        fileExt=os.path.splitext(file)[-1]
        if fileExt == '.c':
            results.append(file)
Answered By: fredley

Try “glob”:

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
Answered By: Maciej Kucharz
import os, re
cfile = re.compile("^.*?.c$")
results = []

for name in os.listdir(directory):
    if cfile.match(name):
        results.append(name)
Answered By: Manoj Govindan

If you replace '.c' with '[.]c$', you’re searching for files that contain .c as the last two characters of the name, rather than all files that contain a c, with at least one character before it.

Edit: Alternatively, match f[-2:] with '.c', this MAY be computationally cheaper than pulling out a regexp match.

Answered By: Vatine

try changing the inner loop to something like this

results += [each for each in os.listdir(folder) if each.endswith('.c')]
Answered By: deif

KISS

# KISS

import os

results = []

for folder in gamefolders:
    for f in os.listdir(folder):
        if f.endswith('.c'):
            results.append(f)

print results
Answered By: Jive Dadson

For another alternative you could use fnmatch

import fnmatch
import os

results = []
for root, dirs, files in os.walk(path)
    for _file in files:
        if fnmatch.fnmatch(_file, '*.c'):
            results.append(os.path.join(root, _file))

print results

or with a list comprehension:

for root, dirs, files in os.walk(path)
    [results.append(os.path.join(root, _file))
        for _file in files if 
            fnmatch.fnmatch(_file, '*.c')] 

or using filter:

for root, dirs, files in os.walk(path):
    [results.append(os.path.join(root, _file))
        for _file in fnmatch.filter(files, '*.c')]     
Answered By: volting

The implementation of shutil.copytree is in the docs. I mofdified it to take a list of extentions to INCLUDE.

def my_copytree(src, dst, symlinks=False, *extentions):
    """ I modified the 2.7 implementation of shutils.copytree
    to take a list of extentions to INCLUDE, instead of an ignore list.
    """
    names = os.listdir(src)
    os.makedirs(dst)
    errors = []
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                my_copytree(srcname, dstname, symlinks, *extentions)
            else:
                ext = os.path.splitext(srcname)[1]
                if not ext in extentions:
                    # skip the file
                    continue
                copy2(srcname, dstname)
            # XXX What about devices, sockets etc.?
        except (IOError, os.error), why:
            errors.append((srcname, dstname, str(why)))
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error, err:
            errors.extend(err.args[0])
    try:
        copystat(src, dst)
    # except WindowsError: # cant copy file access times on Windows
    #     pass
    except OSError, why:
        errors.extend((src, dst, str(why)))
    if errors:
        raise Error(errors)

Usage: For example, to copy only .config and .bat files….

my_copytree(source, targ, ‘.config’, ‘.bat’)

Answered By: Scott

Just to be clear, if you wanted the dot character in your search term, you could’ve escaped it too:

‘.*[backslash].c’ would give you what you needed, plus you would need to use something like:

results.append(f), instead of what you had listed as results += [f]

Answered By: tjborromeo

There is a better solution that directly using regular expressions, it is the standard library’s module fnmatch for dealing with file name patterns. (See also glob module.)

Write a helper function:

import fnmatch
import os

def listdir(dirname, pattern="*"):
    return fnmatch.filter(os.listdir(dirname), pattern)

and use it as follows:

result = listdir("./sources", "*.c")
Answered By: firegurafiku

This function returns a list of all file names with the specified extension that live in the specified directory:

import os

def listFiles(path, extension):
    return [f for f in os.listdir(path) if f.endswith(extension)]

print listFiles('/Path/to/directory/with/files', '.txt')

If you want to list all files with the specified extension in a certain directory and its subdirectories you could do:

import os

def filterFiles(path, extension):
    return [file for root, dirs, files in os.walk(path) for file in files if file.endswith(extension)]

print filterFiles('/Path/to/directory/with/files', '.txt')
Answered By: heinst

Change the directory to the given path, so that you can search files within directory. If you don’t change the directory then this code will search files in your present directory location:

import os  #importing os library 
import glob #importing glob library

path=raw_input()  #input from the user 
os.chdir(path)

filedata=glob.glob('*.c') #all files with .c extenstions stores in filedata.
print filedata
Answered By: banoth ravinder

this is pretty clean.
the commands come from the os library.
this code will search through the current working directory and list only the specified file type. You can change this by replacing ‘os.getcwd()’ with your target directory and choose the file type by replacing ‘(ext)’. os.fsdecode is so you don’t get a bytewise error from .endswith(). this also sorts alphabetically, you can remove sorted() for the raw list.

    import os
    filenames = sorted([os.fsdecode(file) for file in os.listdir(os.getcwd()) if os.fsdecode(file).endswith(".(ext)")])
Answered By: Will Morgan

Here’s yet another solution, using pathlib (and Python 3):

from pathlib import Path

gamefolder = "path/to/dir"
result = sorted(Path(gamefolder).glob("**.c"))

Notice the double asterisk (**) in the glob() argument. This will search the gamefolder as well as its subdirectories. If you only want to search the gamefolder, use a single * in the pattern: "*.c". For more details, see the documentation.

Answered By: natka_m

You can actually do this with just os.listdir

import os
results = [f for f in os.listdir(gamefolders/folder) if f.endswith('.c')]
Answered By: someguyinafloppyhat
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.