gpt4 book ai didi

python递归目录读取

转载 作者:行者123 更新时间:2023-12-01 06:05:00 25 4
gpt4 key购买 nike

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

我摆脱了 os.chdir 但由于某种原因函数现在也加入路径+文件并生成错误:WindowsError: [Error 267] 目录名称无效: 'c:\data\foo\notes\*.*'它读取文件夹 foo 并加入了路径 foo 和文件 Notes.txt 而不是 foo + libary 文件夹

最佳答案

这似乎对我有用

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/您可以对普通字典执行相同的操作(如在您的代码中),但使用 defaultdict 您不需要检查之前是否已初始化 key :

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/programas/pack\copia.py
c:/python26/programas/pack\in pack.py
c:/python26/programas/pack\pack2
c:/python26/programas/pack\pack2\copia.py
c:/python26/programas/pack\pack2\in_pack2.py
c:/python26/programas/pack\pack2\pack3
c:/python26/programas/pack\pack2\pack3\copia.py
c:/python26/programas/pack\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/programas/pack\copia.py
c:/python26/programas/pack\in pack.py
c:/python26/programas/pack\pack2
c:/python26/programas/pack\pack2\copia.py
c:/python26/programas/pack\pack2\in_pack2.py
c:/python26/programas/pack\pack2\pack3
c:/python26/programas/pack\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']})

关于python递归目录读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8552131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com