在对这项特定任务进行研究后,我发现大多数针对此类问题的解决方案要么返回所有文件的列表,要么返回文件夹/文件的TOTAL大小。
我想要实现的是在CSV文件中获取输出,说明文件夹结构,即文件夹 - 子文件夹 - 文件(可选)以及EACH的大小信息。
CSV没有特定格式。我只需要知道文件夹/子文件夹大小的树结构。
背后的原因是我们正在从物理服务器迁移到云。为了验证在转换期间是否正确保留了所有数据,我需要制作一个类似的所有共享驱动器列表,以后可以对其进行验证。
期待有意义的见解。谢谢!
答案 0 :(得分:1)
编辑: 那么,那应该是你要求的:
import os
import csv
def sizeof_fmt(num, suffix='B'):
for unit in ['','K','M','G','T','P','E','Z']:
if abs(num) < 1024.0:
return "%3.1f%s%s" % (num, unit, suffix)
num /= 1024.0
return "%.1f%s%s" % (num, 'Yi', suffix)
def get_size(start_path = '.'):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
total_size += os.path.getsize(fp)
return sizeof_fmt(total_size)
with open("yourfilename.csv", mode="w") as dir_file:
csv_writer = csv.writer(dir_file, delimiter=",")
def files_and_sizes(start_path):
dir_list = [file for file in os.listdir(start_path)]
for file in dir_list:
path = start_path + "\\" + file
if os.path.isdir(path) is True:
csv_writer.writerow([file, get_size(path)])
files_and_sizes(start_path + "\\" + file)
files_and_sizes(r"C:\your\path\here")
已更新,以便更好地适应问题。
您可以获取大小如下的所有文件:
import os
all_files_with_size = []
def files_and_sizes(start_path):
dir_list = [file for file in os.listdir(start_path)]
current_dir = []
for file in dir_list:
path = start_path + "\\" + file
if os.path.isdir(path) is True:
current_dir.append(files_and_sizes(path))
else:
current_dir.append((file, os.lstat(path).st_size))
return current_dir
它将返回一个列表,其中包含所有文件(如文件,大小)和每个目录的子列表。 我建议将条目附加到文件中,但格式由您决定。
另外,如果您还想要目录大小:
if os.path.isdir(path) is True:
current_dir.append(file, os.lstat(path).st_size)
current_dir.append(files_and_sizes(path))
答案 1 :(得分:-1)
我相信您必须使用已经找到的解决方案的组合。例如&#39; os.listdir(路径)&#39;获取目录的内容,&#39; os.lstat(path).st_size&#39;获取文件大小,&#os; os.path.isdir(路径)&#39;和&#39; os.path.isfile(路径)&#39;确定类型。