gpt4 book ai didi

python - 如何避免从 os.walk 获取重复路径

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:40 26 4
gpt4 key购买 nike

我有以下目录结构

/mnt/type/split/v2/doc/RESOURCE_ID/YYYY/FY/DOCUMENT_ID

例如,一条路径可能是

/mnt/type/split/v2/doc/100045/2008/FY/28

哪里

RESOURCE_ID = 100045
YYYY = 2008
DOCUMENT_ID = 28

注意,DOCUMENT_ID 是路径中的最后一个目录 - DOCUMENT_ID 目录中将会有文件

我试图使用以下代码来清点该结构

def survey():
magic_paths = []
for (resource_id, dirname,filename) in os.walk('/mnt/type/split/v2/doc'):
if resource_id:
for (magic_path, dirname2,filename2) in os.walk(resource_id):
if len(magic_path.split(os.sep)) == 10:
magic_paths.append(magic_path + os.linesep)
write_survey(magic_paths)
x = len(magic_paths)
return x

我在 magic_paths 列表中获得了每个路径的五个副本。我有 1,500,000 条路径,因此我的列表中有 7,500,00 个项目。

前 1,500,000 个是唯一值。接下来的 6,000,000 个由以 RESOURCE_ID 为根的组组成,重复 4 次

/mnt/type/split/v2/doc/100045/2008/FY/28 #obs_1
/mnt/type/split/v2/doc/100045/2008/FY/29 #obs_2
/mnt/type/split/v2/doc/100045/2008/FY/30 #obs_3
/mnt/type/split/v2/doc/100045/2008/FY/31 #obs_4
/mnt/type/split/v2/doc/1028/2008/FY/28 #obs_5 # see the new RESOURCE_ID
.
. 1,499,995 more unique values
.
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of first repetition
/mnt/type/split/v2/doc/100045/2008/FY/29
/mnt/type/split/v2/doc/100045/2008/FY/30
/mnt/type/split/v2/doc/100045/2008/FY/31
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of second repetition
/mnt/type/split/v2/doc/100045/2008/FY/29
/mnt/type/split/v2/doc/100045/2008/FY/30
/mnt/type/split/v2/doc/100045/2008/FY/31
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of third repetition
/mnt/type/split/v2/doc/100045/2008/FY/29
/mnt/type/split/v2/doc/100045/2008/FY/30
/mnt/type/split/v2/doc/100045/2008/FY/31
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of fourth repetition
/mnt/type/split/v2/doc/100045/2008/FY/29
/mnt/type/split/v2/doc/100045/2008/FY/30
/mnt/type/split/v2/doc/100045/2008/FY/31
/mnt/type/split/v2/doc/1028/2008/FY/28 #series of 4 repetitions based on RESOURCE ID 1028

每个级别的目录和子目录中都有各种文件,我只需要清点 DOCUMENT_ID 的路径即可。

我不明白为什么结果是这样的。我相信我是从 RESOURCE_ID 开始,只找到深度为 9 的目录,因为在 os.sep 上分割给了我一个包含 10 个项目的列表。

'/mnt/type/split/v2/doc/100045/2008/FY/31'.split(os.sep) = ['','mnt',type','split','v2','doc','100045','2008','FY','31']

回答评论中的问题

  1. 我相信我正在获取每个 RESOURCE_ID 目录,然后遍历它。从第一个 os.walk 返回的其他项目(目录名和文件名)将被忽略
  2. 我认为 os.listdir 不起作用,我可以使用 glob 来完成这项工作,但担心它会占用我的内存

最佳答案

os.walk()递归地遍历目录结构。对于遇到的每个目录,您都会启动另一个递归调用。因此,对于每个目录,您都会递归地遍历该目录以及所有嵌套目录。这包括嵌套目录。开始搜索 /mnt/type/split/v2/doc/mnt/type/split/v2/doc/100045/mnt/类型/split/v2/doc/100045/2008/mnt/type/split/v2/doc/100045/2008/mnt/type/split/v2/doc/100045/2008/FY 路径,每个文档 ID 生成 5 个匹配项。

仅调用os.walk()一次:

def survey():
magic_paths = []
for (resource_id, dirnames, filenames) in os.walk('/mnt/type/split/v2/doc'):
if len(resource_id.split(os.sep)) == 10:
magic_paths.append(resource_id + os.linesep)
write_survey(magic_paths)
x = len(magic_paths)
return x

找到匹配项后,您可能需要修剪搜索;一旦找到 DOCUMENT_ID 目录,就没有必要再搜索其他子目录了:

def survey():
magic_paths = []
for (resource_id, dirnames, filenames) in os.walk('/mnt/type/split/v2/doc'):
if len(resource_id.split(os.sep)) == 10:
magic_paths.append(resource_id + os.linesep)
dirnames[:] = [] # clear the subdirs list to stop further recursion here
write_survey(magic_paths)
x = len(magic_paths)
return x

关于python - 如何避免从 os.walk 获取重复路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109351/

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