我懂操作系统了吗?走吧?

2024-05-14 16:37:40 发布

您现在位置:Python中文网/ 问答频道 /正文

os.walk(startdir)中,根、目录、文件的循环通过以下步骤工作?

for root in os.walk(startdir) 
    for dir in root 
        for files in dir
  1. 获取start dir的根目录:C:\ dir1\dir2\startdir

  2. 在C:\ dir1\dir2\startdir中获取文件夹并返回文件夹列表“dirlist”

  3. 获取第一个目录列表项中的文件,并将文件列表“filelist”作为文件列表的第一个项返回。

  4. 移到目录列表中的第二个项目,并将此文件夹中的文件列表“filelist2”作为文件列表中的第二个项目返回。等

  5. 移到foldertree中的下一个根目录并从2开始。等

对吧?或者它只是先得到所有根,然后是所有dirs,然后是所有文件?


Tags: 文件项目in目录文件夹列表foros
3条回答

最小可运行示例

这就是我喜欢学习的方式:

mkdir root
cd root
mkdir \
  d0 \
  d1 \
  d0/d0_d1
touch \
   f0 \
   d0/d0_f0 \
   d0/d0_f1 \
   d0/d0_d1/d0_d1_f0
tree

输出:

.
├── d0
│   ├── d0_d1
│   │   └── d0_d1_f0
│   ├── d0_f0
│   └── d0_f1
├── d1
└── f0

主.py

#!/usr/bin/env python3
import os
for path, dirnames, filenames in os.walk('root'):
    print('{} {} {}'.format(repr(path), repr(dirnames), repr(filenames)))

输出:

'root' ['d0', 'd1'] ['f0']
'root/d0' ['d0_d1'] ['d0_f0', 'd0_f1']
'root/d0/d0_d1' [] ['d0_d1_f0']
'root/d1' [] []

这一切都很清楚:

  • path是每个步骤的根目录
  • dirnames是每个path中目录基名称的列表
  • filenames是每个path中的文件基名列表

在Ubuntu 16.04,Python 3.5.2上测试。

修改dirnames更改树递归

这基本上是你唯一需要记住的事情。

例如,如果对dirnames执行以下操作,则会影响遍历:

漫游文件或目录

如果要遍历的输入是文件或目录,则可以如下处理:

#!/usr/bin/env python3

import os
import sys

def walk_file_or_dir(root):
    if os.path.isfile(root):
        dirname, basename = os.path.split(root)
        yield dirname, [], [basename]
    else:
        for path, dirnames, filenames in os.walk(root):
            yield path, dirnames, filenames

for path, dirnames, filenames in walk_file_or_dir(sys.argv[1]):
    print(path, dirnames, filenames)

简单地说,os.walk()将生成给定路径中存在的路径、文件夹和文件的元组,并继续遍历子文件夹。

import os.path
path=input(" enter the path\n")
for path,subdir,files in os.walk(path):
   for name in subdir:
       print os.path.join(path,name) # will print path of directories
   for name in files:    
       print os.path.join(path,name) # will print path of files

这将生成子目录中所有子目录、文件和文件的路径

os.walk返回一个生成器,它创建一个值元组(当前路径、当前路径中的目录、当前路径中的文件)。

每次调用生成器时,它将递归地跟踪每个目录,直到从调用walk的初始目录中没有更多的子目录可用为止。

因此

os.walk('C:\dir1\dir2\startdir').next()[0] # returns 'C:\dir1\dir2\startdir'
os.walk('C:\dir1\dir2\startdir').next()[1] # returns all the dirs in 'C:\dir1\dir2\startdir'
os.walk('C:\dir1\dir2\startdir').next()[2] # returns all the files in 'C:\dir1\dir2\startdir'

所以

import os.path
....
for path, directories, files in os.walk('C:\dir1\dir2\startdir'):
     if file in files:
          print 'found %s' % os.path.join(path, file)

或者这个

def search_file(directory = None, file = None):
    assert os.path.isdir(directory)
    for cur_path, directories, files in os.walk(directory):
        if file in files:
            return os.path.join(directory, cur_path, file)
    return None

或者,如果要查找文件,可以执行以下操作:

import os
def search_file(directory = None, file = None):
    assert os.path.isdir(directory)
    current_path, directories, files = os.walk(directory).next()
    if file in files:
        return os.path.join(directory, file)
    elif directories == '':
        return None
    else:
        for new_directory in directories:
            result = search_file(directory = os.path.join(directory, new_directory), file = file)
            if result:
                return result
        return None

相关问题 更多 >

    热门问题