首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文件遍历

Python文件遍历
EN

Stack Overflow用户
提问于 2013-06-19 14:19:11
回答 2查看 279关注 0票数 0

我正在尝试创建一个函数,它接受根文件的名称,然后遍历目录并返回如下列表。

代码语言:javascript
复制
[["folder1",[
    ["subfolder1",[
        "file1",
        "file2"
    ]],
    ["subfolder2",[
        "file3",
        "file4"
    ]]
],"file5","file6"]

下面是我在该函数中的尝试:

代码语言:javascript
复制
def traverse(rootdir):
    names = []
    for cdirname, dirnames, filenames in os.walk(rootdir):
        # record path to all subdirectories first.
        for subdirname in dirnames:
            names.append([subdirname,traverse(os.path.join(cdirname, subdirname))])

        # record path to all filenames.
        for filename in filenames:
            names.append(os.path.join(cdirname, filename))

    return names

我的问题是,我总是得到与函数记录的相同文件/文件夹的副本,并且I路径总是相对于"rootdir“显示,而不仅仅是相应文件/文件夹的名称。我如何剔除重复的内容?另外,我如何才能使它不是被记录的完整路径。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-19 15:05:53

sorted用于将目录放在第一位。如果您不介意这个顺序,只需返回names即可。

代码语言:javascript
复制
def traverse(rootdir):
    names = []
    dirs, files = [], []
    for filename in os.listdir(rootdir):
        filepath = os.path.join(rootdir, filename)
        if os.path.isdir(filepath):
            names.append([filename, traverse(filepath)])
        else:
            names.append(filename)
    return sorted(names, key=lambda x: (0, x[0]) if isinstance(x, list) else (1, x))

另一个使用os.walk的版本

代码语言:javascript
复制
def traverse(rootdir):
    names = []
    dir_to_names = {rootdir: names}
    for cdirname, dirnames, filenames in os.walk(rootdir):
        subnames = dir_to_names[cdirname]
        for subdirname in sorted(dirnames):
            subnames2 = dir_to_names[os.path.join(cdirname, subdirname)] = []
            subnames.append([subdirname, subnames2])
        for filename in sorted(filenames):
            subnames.append(filename)
    return names
票数 1
EN

Stack Overflow用户

发布于 2013-06-19 14:48:00

您可以使用os.walk()获取所有子目录和子文件。它返回一个包含“三元组”的列表(‘当前路径’,子目录,子文件)。但这并不能满足我的需求,所以我编写了以下脚本。希望这能有所帮助。

它所做的是为包含文件和目录的每个文件夹创建一个对象,并按字母顺序对它们进行排序。我研究了os.walk及其工作原理,这是一种类似的方法(使用isdir())。tab变量只是为了更好地查看输出。

代码语言:javascript
复制
import os


class Folder():
    """ Generate a tree list from a given directory """
    # List of prohibited_dirs folders on any levels
    prohibited_dirs = set([])
    prohibited_files = set([])
    tab = 0
    def __init__(self, path, folder_name):
        """ path should be /home/example, folder_name: example """
        self.path = path
        self.folder_name = folder_name
        self.sub_dirs = []
        self.sub_files = []
        self.__class__.tab += 1
        # print self.tab

    def sorter(self):
        """ sorts listdir output for folders and files"""
        # Sort Folders and Files
        names = os.listdir(self.path)
        for name in names:
            if os.path.isdir(os.path.join(self.path, name)):
                self.sub_dirs.append(name)
            else:
                self.sub_files.append(name)

    def list_stuff(self):
        """ sort lists, and iterate overall subfolders/files."""
        # Sort alphabetically
        self.sub_dirs.sort(key=str.lower)
        self.sub_files.sort(key=str.lower)
        # all subfolders, if is also break condition
        if self.sub_dirs:
            # Filter prohibited_dirs Folders
            for sub_dir in self.sub_dirs:
                if sub_dir in self.__class__.prohibited_dirs:
                    continue
                print "\t" * self.tab + sub_dir
                # Go deeper
                deeper = Folder(os.path.join(self.path, sub_dir), sub_dir)
                deeper.sorter()
                deeper.list_stuff()
                # Free object
                del deeper
                self.__class__.tab -= 1
        # list all Files, if is also break condition
        if self.sub_files:
            for sub_file in self.sub_files:
                if sub_file in self.__class__.prohibited_files:
                    continue
                print "\t" * self.tab + sub_file

STARTDIRECTORY = "."
STARTFOLDER = "."

runner = Folder(STARTDIRECTORY, STARTFOLDER)
runner.sorter()
runner.list_stuff()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17184139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档