我试图计算目录和子目录中的文件数,但答案错误。
我有一个文件夹名称:train
,其中包含10个子文件夹。每个子文件夹包含900个文件。
当我用以下代码计数文件时,我得到0个错误的文件(必须为9000)。
看来isfile
无效。
我想念什么?
TRAIN_IMAGES_DIR = 'C:\\test\\train\\'
NUM_OF_FILES = 0
for subdir, dirs, files in os.walk(TRAIN_IMAGES_DIR):
for file in files:
print (file)
if os.path.isfile(file):
NUM_OF_FILES = NUM_OF_FILES + 1
else:
print("Folder: ", file)
print (NUM_OF_FILES)
我正在使用python 3.7
答案 0 :(得分:3)
您根本不需要使用isfile()
,因为os.walk()
已经为您分离了目录和文件。正确完成后,对于files
列表中的所有元素,测试将为True。
出问题的是,每个文件名都是相对的 ,它只是路径的最后一个元素。 os.path.isfile()
只能在当前工作目录中查找此类名称,而实际上不是这些文件所在的位置。您必须使用os.path.join(subdir, file)
将相对文件名转换为绝对路径。
但是,再次,不要使用isfile()
,这只是双重工作。 os.walk()
已经为您整理了文件。
以下内容可以计算您的文件数:
NUM_OF_FILES = 0
for subdir, dirs, files in os.walk(TRAIN_IMAGES_DIR):
NUM_OF_FILES = NUM_OF_FILES + len(files)
因为您只需要在这里知道列表的长度即可。您也可以使用NUM_OF_FILES += len(files)
添加长度。
使用sum()
function和generator expression,甚至更短:
NUM_OF_FILES = sum(len(files) for _, _, files in os.walk(TRAIN_IMAGES_DIR))
如果这产生的数量高于预期的编号,则意味着您拥有的文件数量超出了预期。例如,您可能有 hidden 文件(在POSIX系统上,任何以.
开头的文件都将从目录列表中隐藏,除非您使用ls -a
或类似的技术来显示它们)
您也许可以先使用文件扩展名过滤文件; os.path.splitext(file)
为此可以给您一个(base, ext)
元组。或者只是滤除file[0] == "."
值。
答案 1 :(得分:0)
Pathlib glob较慢,但在不需要超级速度时方便。
def __get_files(p:PathOrStr):
p = Path(p)
res = [] # result list
return p.glob("**/*") # all the files
gen = __get_files(p=r"C:\Users\dj\")
for _ in gen:
print(_)