计算目录中具有相同名称的多个文件

时间:2018-07-17 22:07:29

标签: python-3.x glob os.path

我是Python的新手,正在从事一个项目,用户可以导航到一个文件夹,然后程序对该文件夹中具有特定名称的所有文件进行计数。

问题是我有一个包含5000多个文件的文件夹,其中许多文件具有相同的名称但扩展名不同。我写的代码在某种程度上可以完成最终版本的工作,但它非常多余,我看不出自己要使用600多个文件名。

想问问是否有可能使该程序“自动化”或减少冗余,而我不必手动键入600个文件的名称来返回数据。

我当前拥有的示例代码:

import os, sys
print(sys.version)

file_counting1 = 0
file_counting2 = 0

filepath = input("Enter file path here: ")

if os.path.exists(filepath):

    for file in os.listdir(filepath):
        if file.startswith('expressmail'):
            file_counting1 += 1
    print('expressmail')
    print('Total files found:', file_counting1)

    for file in os.listdir(filepath):
        if file.startswith('prioritymail'):
            file_counting2 += 1
    print('prioritymail')
    print('Total files found:', file_counting2)

样本输出:

expressmail
Total files found: 3
prioritymail
Total files found: 1

3 个答案:

答案 0 :(得分:1)

您可以通过多种方法来完成自己想做的事情。部分取决于您是否需要恢复给定重复文件的扩展名列表。

    来自收集模块的
  1. 计数器-使用此计数器可进行简单的文件计数。建立计数时,请忽略扩展名。
  2. 使用不带扩展名的文件名作为字典键,添加项目列表作为键值,其中项目列表是文件的每次出现。

下面是使用Counter类的示例:

import os, sys, collections
c = collections.Counter()
for root, dirs,files in os.walk('/home/myname/hg/2018/'):
    # discard any path data and just use filename
    for names in files:
        name, ext = os.path.splitext(names)
        # discard any extension
        c[name] += 1
# Counter.most_common() gives the values in the form of (entry, count)
# Counter.most_common(x) - pass a value to display only the top x counts
# e.g. Counter.most_common(2) = top 2
for x in c.most_common():
    print(x[0] + ': ' + str(x[1]))

答案 1 :(得分:1)

以下脚本将计算同名文件的出现次数。如果文件没有扩展名,则将整个文件名视为名称。它也不会遍历子目录,因为原始问题只是询问给定文件夹中的文件。

import os

dir_name = "."
files = next(os.walk(dir_name))[2]  # get all the files directly in the directory
names = [f[:f.rindex(".")] for f in files if "." in f] # drop the extensions
names += [f for f in files if "." not in f] # add those without extensions
for name in set(names): # for each unique name-
    print("{}\nTotal files found: {}".format(name, names.count(name)))

如果要支持子目录中的文件,可以使用

files = [os.path.join(r,file) for r,d,f in os.walk(dir_name) for file in f]

如果您不想考虑没有扩展名的文件,只需删除以下行:

names += [f for f in files if "." not in f]

答案 2 :(得分:0)

您可以使用正则表达式:

import os, sys, re
print(sys.version)


filepath = input("Enter file path here: ")

if os.path.exists(filepath):
    allfiles = "\n".join(os.listdir(filepath))

    file_counting1 = len(re.findall("^expressmail",allfiles,re.M))
    print('expressmail')
    print('Total files found:', file_counting1)

    file_counting2 = len(re.findall("^prioritymail",allfiles,re.M))
    print('prioritymail')
    print('Total files found:', file_counting2)