在python中获取文件夹结构以及文件夹/文件大小

时间:2017-11-15 02:16:13

标签: python python-3.x csv

在对这项特定任务进行研究后,我发现大多数针对此类问题的解决方案要么返回所有文件的列表,要么返回文件夹/文件的TOTAL大小。

我想要实现的是在CSV文件中获取输出,说明文件夹结构,即文件夹 - 子文件夹 - 文件(可选)以及EACH的大小信息。

CSV没有特定格式。我只需要知道文件夹/子文件夹大小的树结构。

背后的原因是我们正在从物理服务器迁移到云。为了验证在转换期间是否正确保留了所有数据,我需要制作一个类似的所有共享驱动器列表,以后可以对其进行验证。

期待有意义的见解。谢谢!

2 个答案:

答案 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;确定类型。