Python 生成文件扩展名和大小字典的程序
Python program to produce dictionary of file extensions and sizes
我正在尝试在 Python 中创建一个程序,它将搜索一个文件目录并创建一个字典,其中 ose 键是目录中的各种文件扩展名,而 whose 个值构成列表,其中包含扩展名在目录中出现的次数、具有该扩展名的最大文件的大小、最小文件的大小以及具有该扩展名的文件的平均大小。
到目前为止我已经写了以下内容:
for root, dirs, files in os.walk('.'):
contents={}
for name in files:
size=(os.path.getsize(name))
title, extension=os.path.splitext(name)
if extension not in contents:
contents[extension]=[1, size, size, size]
else:
contents[extension][0]=contents[extension][0]+1
contents[extension][3]=contents[extension][3]+size
if size>=contents[extension][1]:
contents[extension][1]=size
elif size<contents[extension][2]:
contents[extension][2]=size
contents[extension][3]=contents[extension][3]/contents[extension][0]
print(contents)
如果我导入 os 并使用 os.chdir() 进入我想浏览的目录,这个脚本的工作范围是 returns 字典 whose 键是目录中的扩展名,而 whose 值是正确识别扩展名出现次数、具有该扩展名的最大文件大小以及最小文件大小的列表。错误的地方是在一种情况下平均值计算正确,但在其他情况下它不正确但方式不一致。
有什么解决这个问题的建议吗?我希望字典在每种情况下都显示适当的平均值。我是 Python 和编程的新手,显然缺少一些东西!
提前致谢。
有一点肯定是个问题,那就是要获取文件的大小,您需要使用正确的相对路径。当 os.walk()
递归到子目录时,相对路径是 root+"/"+name
—— 而不仅仅是 name
。所以你应该得到这样的尺寸:
size=os.path.getsize(root+"/"+name)
(您的变量 root
实际上不是目录树的 "root";它是文件在 files
中列出的每个目录。)
这能解决问题吗?谁知道。您的代码现在应该引发异常,所以要么您没有任何子目录,要么您没有向我们展示您的完整代码。
在你的最后一步中,
contents[extension][3]=contents[extension][3]/contents[extension][0]
您只对单个扩展程序执行此操作,您需要遍历所有扩展程序:
for extension in contents:
contents[extension][3]=contents[extension][3]/contents[extension][0]
尝试:
for root, dirs, files in os.walk('.'):
contents={}
for name in files:
size=(os.path.getsize(name))
title, extension=os.path.splitext(name)
if extension not in contents:
contents[extension]=[1, size, size, size]
else:
contents[extension][0]=contents[extension][0]+1
contents[extension][3]=contents[extension][3]+size
if size>=contents[extension][1]:
contents[extension][1]=size
elif size<contents[extension][2]:
contents[extension][2]=size
for k in contents.keys():
contents[k][3]=contents[k][3] / float(contents[k][0])
print(contents)
您只计算其中一个扩展的平均值,即最后一个。
并使用浮点数,如果不这样做,答案将不准确。
我正在尝试在 Python 中创建一个程序,它将搜索一个文件目录并创建一个字典,其中 ose 键是目录中的各种文件扩展名,而 whose 个值构成列表,其中包含扩展名在目录中出现的次数、具有该扩展名的最大文件的大小、最小文件的大小以及具有该扩展名的文件的平均大小。
到目前为止我已经写了以下内容:
for root, dirs, files in os.walk('.'):
contents={}
for name in files:
size=(os.path.getsize(name))
title, extension=os.path.splitext(name)
if extension not in contents:
contents[extension]=[1, size, size, size]
else:
contents[extension][0]=contents[extension][0]+1
contents[extension][3]=contents[extension][3]+size
if size>=contents[extension][1]:
contents[extension][1]=size
elif size<contents[extension][2]:
contents[extension][2]=size
contents[extension][3]=contents[extension][3]/contents[extension][0]
print(contents)
如果我导入 os 并使用 os.chdir() 进入我想浏览的目录,这个脚本的工作范围是 returns 字典 whose 键是目录中的扩展名,而 whose 值是正确识别扩展名出现次数、具有该扩展名的最大文件大小以及最小文件大小的列表。错误的地方是在一种情况下平均值计算正确,但在其他情况下它不正确但方式不一致。
有什么解决这个问题的建议吗?我希望字典在每种情况下都显示适当的平均值。我是 Python 和编程的新手,显然缺少一些东西!
提前致谢。
有一点肯定是个问题,那就是要获取文件的大小,您需要使用正确的相对路径。当 os.walk()
递归到子目录时,相对路径是 root+"/"+name
—— 而不仅仅是 name
。所以你应该得到这样的尺寸:
size=os.path.getsize(root+"/"+name)
(您的变量 root
实际上不是目录树的 "root";它是文件在 files
中列出的每个目录。)
这能解决问题吗?谁知道。您的代码现在应该引发异常,所以要么您没有任何子目录,要么您没有向我们展示您的完整代码。
在你的最后一步中,
contents[extension][3]=contents[extension][3]/contents[extension][0]
您只对单个扩展程序执行此操作,您需要遍历所有扩展程序:
for extension in contents:
contents[extension][3]=contents[extension][3]/contents[extension][0]
尝试:
for root, dirs, files in os.walk('.'):
contents={}
for name in files:
size=(os.path.getsize(name))
title, extension=os.path.splitext(name)
if extension not in contents:
contents[extension]=[1, size, size, size]
else:
contents[extension][0]=contents[extension][0]+1
contents[extension][3]=contents[extension][3]+size
if size>=contents[extension][1]:
contents[extension][1]=size
elif size<contents[extension][2]:
contents[extension][2]=size
for k in contents.keys():
contents[k][3]=contents[k][3] / float(contents[k][0])
print(contents)
您只计算其中一个扩展的平均值,即最后一个。
并使用浮点数,如果不这样做,答案将不准确。