我需要遍历给定目录中的所有.asm文件,并对它们执行一些操作。

如何以有效的方式做到这一点?


当前回答

通过执行此操作,获取目录中的所有.asm文件。

import os

path = "path_to_file"
file_type = '.asm'

for filename in os.listdir(path=path):
    if filename.endswith(file_type):
        print(filename)
        print(f"{path}/{filename}")
        # do something below
  

其他回答

下面是我如何在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

这些技术都不能保证任何迭代排序

是的,超级不可预测。请注意,我对文件名进行了排序,如果文件的顺序很重要,即对于视频帧或时间相关的数据收集,这一点很重要。不过,一定要在文件名中添加索引!

您可以使用glob来引用目录和列表:

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

要获取数组中所有目录的列表,可以使用os:

os.listdir(directory)

自Python3.5以来,os.scandir()的操作变得更加简单,速度也快了2-20倍(来源):

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

使用scandir()而不是listdir()可以显著提高还需要文件类型或文件属性的代码的性能信息,因为os.DirEntry对象在以下情况下公开此信息操作系统在扫描目录时提供它。全部的os.DirEntry方法可以执行系统调用,但is_dir()和is_file()通常只需要对符号链接进行系统调用;os.DirEntry.stat()始终需要Unix上的系统调用,但仅Windows上的符号链接需要一个。

这将遍历所有子代文件,而不仅仅是目录的直接子代:

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)

通过执行此操作,获取目录中的所有.asm文件。

import os

path = "path_to_file"
file_type = '.asm'

for filename in os.listdir(path=path):
    if filename.endswith(file_type):
        print(filename)
        print(f"{path}/{filename}")
        # do something below