python os.walk如何不遍历隐藏文件_关于python:如何避免从os.walk获取重复路径

我有以下目录结构

/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']

回应评论中的问题

我相信我正在获取每个RESOURCE_ID目录,然后进行遍历。从第一个os.walk返回的其他项(目录名和文件名)将被忽略

我不认为os.listdir可以工作,我可以使用glob进行工作,但担心它会消耗我的记忆

为什么每个目录走两次? 您再次调用walk()。

您了解os.listdir和os.walk之间的区别吗? 第二个为您做递归。 嵌套walk()调用看起来非常可疑。

另外,请发布实际代码; 您发布的代码不是有效的Python; 例如,路径不是带引号的字符串。 有了这样的错误,很难找出您发布到帖子中的其他错误,这些错误不在您的真实代码中。 我假设os.walk()和walk()是相同的函数,但不能

请给我一分钟,这是代码,您是正确的os.walk()和walk()是相同的-完成了我在原始代码中导入路径(它是一个变量)的操作,只是忘了在此处引用。

os.walk()将递归遍历目录结构。 对于遇到的每个目录,您将启动另一个递归调用。 因此,对于每个目录,您将递归遍历该目录以及所有嵌套目录。 这包括嵌套目录。 通过开始搜索/mnt/type/split/v2/doc,/mnt/type/split/v2/doc/100045,/mnt/type/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

您说的是,当它抛出一个resource_id目录时,该目录随后会自动走动,请原谅我的语言,以便所有YYYY目录都可以走动。 。 。 这可以帮助我理解为什么os.walk不内置通配符-不需要通配符,而是测试输出

@MartijinPieters-您可以编辑此内容以解释为什么我按照该特定顺序正好有4个骗子吗?

@PyNEwbie:os.walk()首先深度浏览树,这取决于树的深度,对于给定的父目录,它引出相同嵌套子目录的频率是您启动另一个os.walk()的频率。 但是,由于存在4个嵌套级别,因此每个匹配项的4个父目录中的每个目录的os.walk()踢角。

@MartijinPieters我试图更好地不发表感谢评论,但我无法阻止自己-谢谢,这有助于我理解流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值