python递归目录读取

时间:2011-12-18 13:47:48

标签: python

我希望避免使用os.walk,我使用递归函数来读取文件和文件夹并将文件存储到字典中

我摆脱了os.chdir,但由于某种原因,函数现在也加入了路径+文件,它产生了一个错误: WindowsError:[错误267]目录名称无效:' c:\ data \ foo \ notes \ *。*' 它的读取文件夹foo和它加入路径whit foo和文件notes.txt instad of foo + libary文件夹

1 个答案:

答案 0 :(得分:2)

这似乎对我有用

import os

op = os.path

def fileRead(mydir):
    data = {}
    root = set()
    for i in os.listdir(mydir):
        path = op.join(mydir, i)
        print(path)
        if op.isfile(path):
            data.setdefault(i, set())
            root.add(op.relpath(mydir).replace("\\", "/"))
            data[i] = root
        else:
            data.update(fileRead(path))
    return data


d = fileRead("c:\python32\programas")
print(d)

我仍然不确定你为什么使用set root。我认为目的是在两个目录中拥有相同的文件时保留所有目录。但它不起作用:每次更新都会删除重复键(文件名)的存储值。

这里你有一个工作代码,使用defaultdict /你可以用普通的字典(如你的代码)做同样的事情但是使用defauldict你不需要检查密钥是否已经被初始化:

import os
from collections import defaultdict
op = os.path

def fileRead(mydir):
    data = defaultdict(list)
    for i in os.listdir(mydir):
        path = op.join(mydir, i)
        print(path)
        if op.isfile(path):
            root = op.relpath(mydir).replace("\\", "/")
            data[i].append(root)
        else:
            for k, v in fileRead(path).items():
                data[k].extend(v)
    return data


d = fileRead("c:\python32\programas")
print(d)

编辑:相对于@hughdbrown的评论:

如果您使用data.update(fileRead(path).items())更新数据,那么在我的计算机中呼叫fileRead("c:/python26/programas/pack")时(现在在py26中)就会得到这样的数据:

  

C:/ python26 /计划成/包\ copia.py
  c:/ python26 / programas / pack \ in pack.py
  C:/ python26 /计划成/包\ PACK2
  C:/ python26 /计划成/包\ PACK2 \ copia.py
  C:/ python26 /计划成/包\ PACK2 \ in_pack2.py
  C:/ python26 /计划成/包\ PACK2 \ PACK3
  C:/ python26 /计划成/包\ PACK2 \ PACK3 \ copia.py
  C:/ python26 /计划成/包\ PACK2 \ PACK3 \ in3.py

     

defaultdict('list'>,{'in3.py':['pack / pack2 / pack3'],'copia.py':['pack / pack2 / pack3'],
  'in pack.py':['pack'],'in_pack2.py':['pack / pack2']})

请注意,在多个目录(copia.py)中重复的文件只显示其中一个目录,即更深的目录。但是,使用时列出了所有目录:

for k, v in fileRead(path).items():  data[k].extend(v)
  

C:/ python26 /计划成/包\ copia.py
  c:/ python26 / programas / pack \ in pack.py
  C:/ python26 /计划成/包\ PACK2
  C:/ python26 /计划成/包\ PACK2 \ copia.py
  C:/ python26 /计划成/包\ PACK2 \ in_pack2.py
  C:/ python26 /计划成/包\ PACK2 \ PACK3
  C:/ python26 /计划成/包\ PACK2 \ PACK3 \ copia.py
  c:/ python26 / programas / pack \ pack2 \ pack3 \ in3.py

     

defaultdict(,{'in3.py':['pack / pack2 / pack3'],'copia.py':['pack','pack / pack2','pack / pack2 / pack3'],<登记/>   'in pack.py':['pack'],'in_pack2.py':['pack / pack2']})