How can I iterate over files in a given directory?

前端 未结 9 723
北海茫月
北海茫月 2020-11-22 04:13

I need to iterate through all .asm files inside a given directory and do some actions on them.

How can this be done in a efficient way?

相关标签:
9条回答
  • 2020-11-22 04:46

    Since Python 3.5, things are much easier with os.scandir()

    with os.scandir(path) as it:
        for entry in it:
            if entry.name.endswith(".asm") and entry.is_file():
                print(entry.name, entry.path)
    

    Using scandir() instead of listdir() can significantly increase the performance of code that also needs file type or file attribute information, because os.DirEntry objects expose this information if the operating system provides it when scanning a directory. All os.DirEntry methods may perform a system call, but is_dir() and is_file() usually only require a system call for symbolic links; os.DirEntry.stat() always requires a system call on Unix but only requires one for symbolic links on Windows.

    0 讨论(0)
  • 2020-11-22 04:47

    I'm not quite happy with this implementation yet, I wanted to have a custom constructor that does DirectoryIndex._make(next(os.walk(input_path))) such that you can just pass the path you want a file listing for. Edits welcome!

    import collections
    import os
    
    DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])
    
    for file_name in DirectoryIndex(*next(os.walk('.'))).files:
        file_path = os.path.join(path, file_name)
    
    0 讨论(0)
  • 2020-11-22 04:49

    Python 3.4 and later offer pathlib in the standard library. You could do:

    from pathlib import Path
    
    asm_pths = [pth for pth in Path.cwd().iterdir()
                if pth.suffix == '.asm']
    

    Or if you don't like list comprehensions:

    asm_paths = []
    for pth in Path.cwd().iterdir():
        if pth.suffix == '.asm':
            asm_pths.append(pth)
    

    Path objects can easily be converted to strings.

    0 讨论(0)
  • 2020-11-22 04:50

    Here's how I iterate through files in Python:

    import os
    
    path = 'the/name/of/your/path'
    
    folder = os.fsencode(path)
    
    filenames = []
    
    for file in os.listdir(folder):
        filename = os.fsdecode(file)
        if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
            filenames.append(filename)
    
    filenames.sort() # now you have the filenames and can do something with them
    

    NONE OF THESE TECHNIQUES GUARANTEE ANY ITERATION ORDERING

    Yup, super unpredictable. Notice that I sort the filenames, which is important if the order of the files matters, i.e. for video frames or time dependent data collection. Be sure to put indices in your filenames though!

    0 讨论(0)
  • 2020-11-22 04:57

    Original answer:

    import os
    
    for filename in os.listdir(directory):
        if filename.endswith(".asm") or filename.endswith(".py"): 
             # print(os.path.join(directory, filename))
            continue
        else:
            continue
    

    Python 3.6 version of the above answer, using os - assuming that you have the directory path as a str object in a variable called directory_in_str:

    import os
    
    directory = os.fsencode(directory_in_str)
        
    for file in os.listdir(directory):
         filename = os.fsdecode(file)
         if filename.endswith(".asm") or filename.endswith(".py"): 
             # print(os.path.join(directory, filename))
             continue
         else:
             continue
    

    Or recursively, using pathlib:

    from pathlib import Path
    
    pathlist = Path(directory_in_str).glob('**/*.asm')
    for path in pathlist:
         # because path is object not string
         path_in_str = str(path)
         # print(path_in_str)
    
    • Use rglob to replace glob('**/*.asm') with rglob('*.asm')
      • This is like calling Path.glob() with '**/' added in front of the given relative pattern:
    from pathlib import Path
    
    pathlist = Path(directory_in_str).rglob('*.asm')
    for path in pathlist:
         # because path is object not string
         path_in_str = str(path)
         # print(path_in_str)
    
    0 讨论(0)
  • 2020-11-22 04:57

    This will iterate over all descendant files, not just the immediate children of the directory:

    import os
    
    for subdir, dirs, files in os.walk(rootdir):
        for file in files:
            #print os.path.join(subdir, file)
            filepath = subdir + os.sep + file
    
            if filepath.endswith(".asm"):
                print (filepath)
    
    0 讨论(0)
提交回复
热议问题