Python中的目录列表

0 投票
2 回答
2368 浏览
提问于 2025-04-16 21:36

我在处理目录列表时遇到了问题。假设我有一个目录,里面有一些子目录,名字是从a到z、从0到9,还有一些特殊字符(比如%,-)。在每个子目录里,我有一些相关的xml文件。

所以,我需要读取这些文件的每一行。我尝试了以下代码。

def listFilesMain(dirpath):
    for dirname, dirnames, filenames in os.walk(dirpath):
        for subdirname in dirnames:
            os.path.join(dirname, subdirname)
        for filename in filenames:
            fPath = os.path.join(dirname, filename)
            fileListMain.append(fPath)

这段代码只有在我从子目录运行程序时才有效,但如果我从主目录运行,就没有任何结果。这是怎么回事呢?如果有人能帮忙,我将非常感激。谢谢!

2 个回答

1
    By default, os.walk does not follow symbolic links to subdirectories on
    systems that support them.  In order to get this functionality, set the
    optional argument 'followlinks' to true.

如果你的子目录是软链接(也就是指向其他地方的快捷方式),那么在使用os.walk(..)的时候,要记得加上followlinks=True这个参数。这个参数的作用是告诉程序要跟随这些软链接去查看里面的内容。具体的说明可以参考文档。

2

这样怎么样:

def list_files(dirpath):
    files = []
    for dirname, dirnames, filenames in os.walk(dirpath):
        files += [os.path.join(dirname, filename) for filename in filenames]
    return files

你也可以把这个做成一个生成器,这样就不需要一次性把整个列表都存起来:

def list_files(dirpath):
    for dirname, dirnames, filenames in os.walk(dirpath):
        for filename in filenames:
            yield os.path.join(dirname, filename)

最后,你可能想要强制使用绝对路径:

def list_files(dirpath):
    dirpath = os.path.abspath(dirpath)
    for dirname, dirnames, filenames in os.walk(dirpath):
        for filename in filenames:
            yield os.path.join(dirname, filename)

所有这些都可以用一行代码来调用:

for filePath in list_files(dirpath):
    # Check that the file is an XML file.
    # Then handle the file.

撰写回答