Python: How can I find all files with a particular extension?

前端 未结 13 1946
广开言路
广开言路 2020-12-13 14:05

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.

相关标签:
13条回答
  • 2020-12-13 14:37

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

    0 讨论(0)
  • 2020-12-13 14:38

    try changing the inner loop to something like this

    results += [each for each in os.listdir(folder) if each.endswith('.c')]
    
    0 讨论(0)
  • 2020-12-13 14:45

    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')]     
    
    0 讨论(0)
  • 2020-12-13 14:45

    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)")])
    
    0 讨论(0)
  • 2020-12-13 14:46

    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
    
    0 讨论(0)
  • 2020-12-13 14:46

    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')
    
    0 讨论(0)
提交回复
热议问题