我希望避免使用os.walk,我使用递归函数来读取文件和文件夹并将文件存储到字典中
我摆脱了os.chdir,但由于某种原因,函数现在也加入了路径+文件,它产生了一个错误: WindowsError:[错误267]目录名称无效:' c:\ data \ foo \ notes \ *。*' 它的读取文件夹foo和它加入路径whit foo和文件notes.txt instad of foo + libary文件夹
答案 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.pydefaultdict('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.pydefaultdict(,{'in3.py':['pack / pack2 / pack3'],'copia.py':['pack','pack / pack2','pack / pack2 / pack3'],<登记/> 'in pack.py':['pack'],'in_pack2.py':['pack / pack2']})