注册 登录
编程论坛 Python论坛

关于对目录和文件的操作

firewater 发布于 2016-01-14 16:32, 5227 次点击
最近在看廖雪峰的python教程,看到了这样一个题目
练习:编写一个search(s)的函数,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出完整路径:

$ python search.py test
unit_test.log
py/test.py
py/test_os.py
my/logs/unit-test-result.txt
我的是win10,代码如下:
程序代码:
#coding=utf-8

import os

def search(s, dir = '.'):
    absPath = os.path.abspath('.')
    for i in os.listdir(absPath):
        # dir = os.path.join(absPath,i)
        # print i,dir.decode('gbk')
        if os.path.isdir(i):
            dir2 = os.path.join(absPath, i)

            search(s, dir2)
        elif os.path.isfile(i) and s in i:
            #pass
            print absPath+i



if __name__ == '__main__':
    search('.py')
但是一直提示错误:
.........
  File "E:/ѧϰ/Python/test/test.py", line 14, in search
    search(s, dir2.decode('gbk'))
  File "E:/ѧϰ/Python/test/test.py", line 14, in search
    search(s, dir2.decode('gbk'))
  File "E:/ѧϰ/Python/test/test.py", line 7, in search
    absPath = os.path.abspath('.')
  File "C:\Python27\lib\ntpath.py", line 495, in abspath
    return normpath(path)
  File "C:\Python27\lib\ntpath.py", line 418, in normpath
    backslash, dot = (u'\\', u'.') if isinstance(path, _unicode) else ('\\', '.')
RuntimeError: maximum recursion depth exceeded while calling a Python object
一直没搞明白哪里错了
2 回复
#2
fenghelong2016-01-31 13:48
程序代码:
# -*- coding: utf-8 -*-
'''
Created on 01 30, 2016

@author: tolerious

'''

import os,sys

def scandir(startdir, target) :
    os.chdir(startdir)
    for obj in os.listdir(os.curdir) :
        if target in obj :
            print os.getcwd() + os.sep + obj
        if os.path.isdir(obj) :
            scandir(obj, target)
            os.chdir(os.pardir)

if __name__ == "__main__":
    scandir(os.curdir,"test")



功能:在当前文件夹以及子文件夹下面找到包含所有"test" 字段的文件,并打印出其完整路径。
这是个递归调用、所以一定要搞清楚在什么情况下停止、以及“os.chdir(os.pardir)”这一步是很关键的、
#3
kicktick2016-02-15 16:40
回复 2楼 fenghelong
两段代码都试了试,确实是第一段出问题,运行错误,第二个可以正常运行。
另外第二个如果用>重定向到文件中也挺方便。如2楼所说,回到父目录是关键,学习了。
刚开始学python,从这一段代码真是体会到python的强大。

[此贴子已经被作者于2016-2-15 16:42编辑过]

1