Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中获取文件夹结构以及文件夹/文件大小_Python_Python 3.x_Csv - Fatal编程技术网

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

在python中获取文件夹结构以及文件夹/文件大小,python,python-3.x,csv,Python,Python 3.x,Csv,在对这项特定任务进行研究之后,我发现针对这类问题给出的大多数解决方案要么返回所有文件的列表,要么返回文件夹/文件的总大小 我试图实现的是在CSV文件中获得一个输出,说明文件夹结构,即文件夹-子文件夹-可选文件以及每个文件夹的大小信息 CSV没有特定的格式。我只需要知道文件夹/子文件夹大小的树结构 这背后的原因是我们正在从物理服务器转向云。为了验证在转换过程中是否正确保留了所有数据,我需要制作一个类似的所有共享驱动器列表,以便稍后进行验证 期待有意义的见解。谢谢 我相信您将不得不使用您已经找到的解

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

我试图实现的是在CSV文件中获得一个输出,说明文件夹结构,即文件夹-子文件夹-可选文件以及每个文件夹的大小信息

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

这背后的原因是我们正在从物理服务器转向云。为了验证在转换过程中是否正确保留了所有数据,我需要制作一个类似的所有共享驱动器列表,以便稍后进行验证


期待有意义的见解。谢谢

我相信您将不得不使用您已经找到的解决方案的组合。例如,“os.listdirpath”用于获取目录内容,“os.lstatpath.st_size”用于获取文件大小,“os.path.isdirpath”和“os.path.isfilepath”用于确定类型。

编辑: Sooo,这应该是你想要的:

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")
它将返回一个包含所有文件的列表,如文件、大小和每个目录的子列表。 我建议将条目附加到文件中,但格式由您决定

此外,如果您还需要目录大小:

if os.path.isdir(path) is True:
        current_dir.append(file, os.lstat(path).st_size)
        current_dir.append(files_and_sizes(path))

谢谢你调查这件事。虽然我在获取目录大小的最后一段代码中也遇到了以下错误-append只接受1个参数,给定2个参数。实际上,我只需要所有文件夹和子文件夹的大小,而不需要文件的大小。此外,当前显示的大小是以字节为单位的,我想如何将其更改为可读格式,如kb、MB、GB等。最后,我只希望将所有这些数据写入csv文件。谢谢你,很抱歉让人讨厌。效果很好。但是现在我认为CSV对于嵌套数据不是一个很好的选择。您是否建议将此类数据存储为XML或JSON?抱歉,回答太晚了。我会选择XML并为每个子目录创建一个容器。
if os.path.isdir(path) is True:
        current_dir.append(file, os.lstat(path).st_size)
        current_dir.append(files_and_sizes(path))