【问题标题】:Get the size of a folder in Linux server获取Linux服务器中文件夹的大小
【发布时间】:2025-11-27 08:50:02
【问题描述】:

虽然以下代码在 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://*.com/a/37367965/6546440的代码

【问题讨论】:

  • /media 是否包含任何文件?通常它只包含几个空目录(直到您插入 CDROM 或记忆棒)。
  • @AntonisChristofides 是的,它有文件...
  • PythonAnywhere dev here -- /media/ 在我们网站的所有帐户中都是一个空目录,并且不可写。您是否正在尝试计算包含上传媒体的目录的大小 - 例如,来自 Django 站点?这更像是/home/yourusername/yoursitename/media
  • 是的,后来我发现这是问题所在……谢谢!

标签: python linux django


【解决方案1】:

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

【讨论】:

  • 正如我在描述中所说,没有错误......也许你是对的,我在服务器中没有权限。我会调查这个
  • 我又测试了一遍。有用。如果文件夹为空,则返回 0。
  • 我已经从你的回答中删除了这个问题,因为这似乎在吸引标志(因为权限可能是这里的实际问题)。当你获得 50 声望时,你就可以离开 cmets 让你询问更多信息
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我试过了,但不行……我想把代码贴在这里,但是太长了
【解决方案3】:

你可以试试这个..

对于 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)

对于窗户:

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)

【讨论】:

  • 语法错误...print (sum(map(lambda fname: os.path.getsize(os.path.join(directory, fname)), files)) for directory, folders, files in os.walk(path)) 呢?我得到<generator object <genexpr> at 0x7fe197d2edb0>...
  • print "%.2f MB"%(folder/MB) 出现语法错误。无论如何,folder 返回 0 :(
  • 拨打print(folder)没有错误。终端打印0
  • @flashter 所以你正在使用 pythonV3 。只需附上 print() 语句。并尝试检查其他文件夹。如果它满足您的需要,请接受(勾选)答案。
【解决方案4】:

这不是解决方案,但获取大小的其他方法是使用 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)

如果您是从项目中执行此操作(而不是在终端中手动执行),"media" ("/home/your-user/your-proyect/media/") 中需要一个完整路径

【讨论】:

    【解决方案5】:

    @gilen-tomas 在 cmets 中给出了解决方案:

    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/"))
    

    需要完整的路径!

    【讨论】: