获取Linux服务器中文件夹的大小

时间:2016-11-28 08:36:11

标签: python linux django

虽然以下代码在Windows中运行良好,但在Linux服务器(pythonanywhere)中,该函数仅返回0,没有错误。我错过了什么?

import os

def folder_size(path):
    total = 0
    for entry in os.scandir(path):
        if entry.is_file():
            total += entry.stat().st_size
        elif entry.is_dir():
            total += folder_size(entry.path)
    return total

print(folder_size("/media"))

参考:来自https://stackoverflow.com/a/37367965/6546440的代码

5 个答案:

答案 0 :(得分:1)

它在linux(Ubuntu服务器16.04,python 3.5)中对我有用,但如果进程没有读取文件的权限,可能会有一些权限错误。

答案 1 :(得分:1)

根据文件系统,底层struct dirent可能不知道任何给定条目是文件还是目录(或其他内容)。也许,在pythonanywhere使用的文件系统上,首先需要stat(stat_result.st_type应该是有效的)。

编辑:在discussion on os.scandir中查看建议通过执行另一个统计来处理DT_UNKNOWN案例。我仍然会尝试确认这些检查是否按预期工作。

答案 2 :(得分:1)

你可以试试这个..

对于linux:

import os
path = '/home/user/Downloads'
folder = sum([sum(map(lambda fname: os.path.getsize(os.path.join(directory, fname)), files)) for directory, folders, files in os.walk(path)])
MB=1024*1024.0
print  "%.2f MB"%(folder/MB)

对于Windows:

import win32com.client as com
folderPath = r"/home/user/Downloads"
fso = com.Dispatch("Scripting.FileSystemObject")
folder = fso.GetFolder(folderPath)
MB=1024*1024.0
print  "%.2f MB"%(folder.Size/MB)

答案 3 :(得分:0)

不是解决方案,但获取大小的其他方法是使用python中的cmd:

import subprocess
import re

cmd = ["du", "-sh", "-b", "media"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
tmp = str(proc.stdout.read())
tmp = re.findall('\d+', tmp)[0]

print(tmp)

如果您是从您的proyect执行此操作(而不是在终端中手动执行),"media""/home/your-user/your-proyect/media/"

需要完整路径

答案 4 :(得分:0)

解决方案由@ gilen-tomas在评论中提供:

import os

def folder_size(path):
    total = 0
    for entry in os.scandir(path):
        if entry.is_file():
            total += entry.stat().st_size
        elif entry.is_dir():
            total += folder_size(entry.path)
    return total

print(folder_size("/home/your-user/your-proyect/media/"))

需要完整的路径!