我是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
答案 0 :(得分:1)
您可以通过多种方法来完成自己想做的事情。部分取决于您是否需要恢复给定重复文件的扩展名列表。
下面是使用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)