如何在python中计算目录中具有两种扩展名的文件数?

如何在python中计算目录中具有两种扩展名的文件数?,python,Python,我有一个包含几种类型文件的目录。 如何计算具有两种扩展名(.txt和.csv)的目录中的文件数? 在我的搜索中,我发现了如何只使用一个特定的扩展名进行计数假设path是您文件夹的路径。然后 import os # get list of files list_of_files = os.listdir(path) # txt files num_txt = len([x for x in list_of_files if x.endswith(".txt")]) # csv files nu

我有一个包含几种类型文件的目录。 如何计算具有两种扩展名(.txt和.csv)的目录中的文件数?
在我的搜索中,我发现了如何只使用一个特定的扩展名进行计数

假设
path
是您文件夹的路径。然后

import os

# get list of files
list_of_files = os.listdir(path)

# txt files
num_txt = len([x for x in list_of_files if x.endswith(".txt")])
# csv files
num_csv = len([x for x in list_of_files if x.endswith(".csv")])

假设
path
是文件夹的路径。然后

import os

# get list of files
list_of_files = os.listdir(path)

# txt files
num_txt = len([x for x in list_of_files if x.endswith(".txt")])
# csv files
num_csv = len([x for x in list_of_files if x.endswith(".csv")])

Yilun答案的一个更好的变体(已经很不错了,因为它不会像
len(glob.glob(*.csv”))
len(glob.glob(*.txt”)
那样扫描目录两次)

不使用
sum
(布尔值被求和为0或1)和生成器创建额外列表(更快):

import os

# get list of files
list_of_files = os.listdir(path)

# txt files
num_txt = sum(x.endswith(".txt") for x in list_of_files)
# csv files
num_csv = sum(x.endswith(".csv") for x in list_of_files)
gencomps+sum很酷,但它仍然在
文件列表上循环/测试两次。好的旧循环毕竟没有那么糟糕(至少它扫描了一次和快捷方式):

顺便说一句,要同时计算这两个参数,请使用
endswith的tuple param功能

# csv & txt files
num_txt_csv = sum(x.endswith((".csv",".txt")) for x in list_of_files)

Yilun答案的一个更好的变体(已经很不错了,因为它不会像
len(glob.glob(*.csv”))
len(glob.glob(*.txt”)
那样扫描目录两次)

不使用
sum
(布尔值被求和为0或1)和生成器创建额外列表(更快):

import os

# get list of files
list_of_files = os.listdir(path)

# txt files
num_txt = sum(x.endswith(".txt") for x in list_of_files)
# csv files
num_csv = sum(x.endswith(".csv") for x in list_of_files)
gencomps+sum很酷,但它仍然在
文件列表上循环/测试两次。好的旧循环毕竟没有那么糟糕(至少它扫描了一次和快捷方式):

顺便说一句,要同时计算这两个参数,请使用
endswith的tuple param功能

# csv & txt files
num_txt_csv = sum(x.endswith((".csv",".txt")) for x in list_of_files)

您可以使用regex筛选文件名:

import os
import re

txt_or_csv = [f for f in os.listdir(path) if re.search(r'.*\.(txt|csv)$', f)]

print(len(txt_or_csv))

您可以使用regex筛选文件名:

import os
import re

txt_or_csv = [f for f in os.listdir(path) if re.search(r'.*\.(txt|csv)$', f)]

print(len(txt_or_csv))

使用
os.walk(dir)
使用
os.walk(dir)
你是说python 3.6?早期版本有一个
scandir
后端口模块。对于
scandir
/
行走
/任何在非常特殊的情况下速度更快的东西:1)windows 2)如果需要对对象执行
统计
。在其他情况下,它不会更快。此外,问题是关于“目录中的文件”<代码>漫游
也扫描子目录(因此速度较慢)你是说python 3.6?早期版本有一个
scandir
后端口模块。对于
scandir
/
行走
/任何在非常特殊的情况下速度更快的东西:1)windows 2)如果需要对对象执行
统计
。在其他情况下,它不会更快。此外,问题是关于“目录中的文件”<代码>行走
也扫描子曲面(因此速度较慢)完美!工作得很漂亮。谢谢@让·弗朗索瓦·法布1。Regex是我想到的第一个工具,它灵活而且值得掌握。2.我添加了
$
以排除
.csvx
,感谢您指出这一点。3.我创建一个列表是因为列表理解很方便。我注意到你的回答也以一种含蓄的方式创建了一个列表。事实上,你的名单更大。我可以更改为
sum(如果重新搜索(r'.*\.(txt | csv)$,f),则os.listdir(path)中的f为True)
。4.我选择regex是因为我不知道
endswith
函数,也不知道您的答案中显示的元组参数用法,我认为它很棒,更像python。感谢您的评论,我学到了很多:在Cpython源代码中使用DI搜索
endswith
,并找到许多使用它匹配文件名后缀的案例。太棒了!工作得很漂亮。谢谢@让·弗朗索瓦·法布1。Regex是我想到的第一个工具,它灵活而且值得掌握。2.我添加了
$
以排除
.csvx
,感谢您指出这一点。3.我创建一个列表是因为列表理解很方便。我注意到你的回答也以一种含蓄的方式创建了一个列表。事实上,你的名单更大。我可以更改为
sum(如果重新搜索(r'.*\.(txt | csv)$,f),则os.listdir(path)中的f为True)
。4.我选择regex是因为我不知道
endswith
函数,也不知道您的答案中显示的元组参数用法,我认为它很棒,更像python。感谢您的评论,我学到了很多:在Cpython源代码中使用DI搜索
endswith
,并找到许多使用它匹配文件名后缀的案例。