gpt4 book ai didi

Python:识别文件夹结构中的数字名称文件夹

转载 作者:行者123 更新时间:2023-12-01 06:28:19 30 4
gpt4 key购买 nike

我有下面的函数,它遍历给定目录的根目录并获取所有子目录并将它们放入列表中。这部分有点作用。

目标是确定最高(最大数量)的数字命名文件夹。假设该文件夹仅包含数字命名的文件夹,并且不包含文件的字母数字文件夹,我很好。但是,如果存在未按数字命名的文件或文件夹,我会遇到问题,因为脚本似乎正在收集所有子目录和文件,并将所有内容都放入列表中。

我只需要找到那些命名为数字的文件夹,而忽略其他任何内容。

Example folder structure for c:\Test
\20200202\
\20200109\
\20190308\
\Apples\
\Oranges\
New Document.txt

这可以遍历目录,但会将所有内容放入列表中,而不仅仅是数字子文件夹。

#Example code
import os
from pprint import pprint

files=[]
MAX_DEPTH = 1
folders = ['C:\\Test']
for stuff in folders:
for root, dirs, files in os.walk(stuff, topdown=True):
for subdirname in dirs:
files.append(os.path.join(subdirname))
#files.append(os.path.join(root, subdirname)) will give full directory
#print("there are", len(files), "files in", root) will show counts of files per directory
if root.count(os.sep) - stuff.count(os.sep) == MAX_DEPTH - 1:
del dirs[:]
pprint(max(files))

ma​​x(files) 的当前结果:新建文档.txt

所需输出:20200202

到目前为止我已经尝试过:

在将每个元素添加到列表之前,我 try catch 每个元素,看看子目录名称的字符串是否可以转换为 int,然后将其添加到列表中。这无法将数字子目录名转换为 int,并且以某种方式(我不知道如何)将 New Document.txt 文件添加到列表中。

files=[]
MAX_DEPTH = 1
folders = ['C:\\Test']
for stuff in folders:
for root, dirs, files in os.walk(stuff, topdown=True):
for subdirname in dirs:
try:
subdirname = int(subdirname)
print("Found subdir named " + subdirname + " type: " + type(subdirname))
files.append(os.path.join(subdirname))
except:
print("Error converting " + str(subdirname) + " to integer")
pass
#files.append(os.path.join(root, subdirname)) will give full directory
#print("there are", len(files), "files in", root) will show counts of files per directory
if root.count(os.sep) - stuff.count(os.sep) == MAX_DEPTH - 1:
del dirs[:]
return (input + "/" + max(files))

我还尝试将所有内容附加到列表中,然后使用下面的内容创建第二个列表(即,没有 try/except),但最终得到一个空列表。我不知道为什么,也不知道从哪里/如何开始寻找。在应用以下内容之前在列表中使用“type”表明列表中的所有内容都是 str 类型。

list2 = [x for x in files if isinstance(x,int) and not isinstance(x,bool)]

最佳答案

我将在这里回答我自己的问题:

改变方法完全有帮助,并且让它变得更快、更简单。

#the find_newest_date function looks for a folder with the largest number and assumes that is the newest data
def find_newest_date(input):
intlistfolders = []
list_subfolders_with_paths = [f.name for f in os.scandir(input) if f.is_dir()]
for x in list_subfolders_with_paths:
try:
intval = int(x)
intlistfolders.append(intval)
except:
pass
return (input + "/" + str(max(intlistfolders)))

说明:

  • scandir 比步行快 3 倍。 directory performance
  • scandir 还允许使用 f.name 只提取文件夹名称,或 f.path 来获取路径。

因此,使用 scandir 加载包含所有子目录的列表。

  1. 迭代列表,并尝试将每个值转换为整数。我不知道为什么它在前面的例子中不起作用,但它在这种情况下有效。
  2. try 语句的第一部分转换为整数。
  3. 如果转换失败,则运行 except 子句,并且 'pass' 为本质上是一个空语句。它什么也不做。
  4. 然后,最后将输入目录与字符串连接起来最大数值的表示(即最近日期的在本例中为文件夹)。

该函数的调用方式为:

folder_named_path = find_newest_date("C:\\Test") or something similar. 

关于Python:识别文件夹结构中的数字名称文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60023058/

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