关于作者

Discuss / Python / io_do_dir_2

io_do_dir_2

问题来源

数据学家琪露诺

#1 Created at ...
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
def find(dir_path, key):
    if not os.path.isdir(dir_path):
        print('The input directory does not exist.')
        return
    for x in os.listdir(dir_path):
        abs_path = os.path.join(dir_path, x)
        if os.path.isfile(abs_path) and key in os.path.splitext(x)[0]:
            print(abs_path)
        if os.path.isdir(abs_path):
            find(abs_path, key)


d = input('the directory path: ')
k = input('the filename keyword: ')
find(d, k)

这里卡了好久,基本参考了discuss同学的。思路是把文件目录看成树结构,文件夹是非叶结点,文件是叶结点。递归遍历判断是否有包含关键字的叶结点。如果文件夹不存在一开始就直接提示并返回。第一题答案在老师的参考源码里。

我的作业地址,欢迎交流指正 https://github.com/xiajava/learn-python3

lubang03

#2 Created at ...

这里要打印的是相对路径,不是绝对路径,你这是绝对路径

数据学家琪露诺

#3 Created at ...

不好意思,改成相对路径:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os


def find(dir_path, key, root):
    if not os.path.isdir(dir_path):
        print('The input directory does not exist.')
        return
    for x in os.listdir(dir_path):
        abs_path = os.path.join(dir_path, x)
        if os.path.isfile(abs_path) and key in os.path.splitext(x)[0]:
            print('..%s' % abs_path[int(len(root)):])
        if os.path.isdir(abs_path):
            find(abs_path, key, root)


def findr(dir_path, key):
    root = dir_path
    find(dir_path, key, root)


d = input('the directory path: ')
k = input('the filename keyword: ')
findr(d, k)

变幻的世界观

#4 Created at ...

有一个bug,如果子目录1下还有子目录2,那你可能会漏掉子目录2中的文件。我就是被卡在这里了。

数据学家琪露诺

#5 Created at ...

回来找io方面代码。楼上的同学能不能给个具体例子说明是怎样漏的? 比如这样:

the directory path: D:\新建文件夹
the filename keyword: 文档
..\新建文件夹\新建文件夹\新建文本文档.txt
..\新建文件夹\新建文件夹 (2)\新建文本文档.txt
..\新建文件夹\新建文件夹 (3)\新建文本文档.txt
..\新建文件夹 (2)\新建文件夹\新建文本文档.txt
..\新建文件夹 (2)\新建文件夹 (2)\新建文本文档.txt
..\新建文件夹 (2)\新建文本文档.txt
..\新建文件夹 (3)\新建文件夹\新建文本文档.txt
..\新建文件夹 (3)\新建文件夹 (2)\新建文本文档.txt
..\新建文件夹 (3)\新建文件夹 (3)\新建文本文档.txt

  • 1

Reply

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.