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

5

以下代码在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://dev59.com/zHM_5IYBdhLWcg3wZSTX#37367965


3
/media 目录下有文件吗?通常情况下,它只包含一些空目录(除非你插入了光盘或内存棒)。 - Antonis Christofides
请参考 https://dev59.com/zHM_5IYBdhLWcg3wZSTX。 - Sanket Sudake
@AntonisChristofides 是的,它有文件... - Rashomon
1
PythonAnywhere的开发人员在这里--我们网站上所有帐户中的/media/目录都是空的,并且不可写。您是否尝试计算包含上传媒体的目录的大小--比如来自Django网站?那应该更像是/home/yourusername/yoursitename/media - Giles Thomas
是的,后来我看到那就是问题所在...谢谢! - Rashomon
5个回答

2
解决方案由@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/"))

需要完整的路径!

1

这在我使用Linux(Ubuntu Server 16.04,Python 3.5)时有效,但如果进程没有读取文件的权限,则可能会出现某些权限错误。


正如我在描述中所说,没有错误......也许你是对的,我在服务器上没有权限。我会调查一下。 - Rashomon
我再次测试了它,它可以工作。如果文件夹为空,则返回0。 - Dávid Fazekas
我已经从你的回答中删除了问题,因为那似乎吸引了标记(而权限可能是实际问题)。当您获得50个声望时,您将能够留下评论,以便要求进一步的信息。 - Sayse

1
根据文件系统的不同,底层的 struct dirent 可能不知道任何给定条目是文件还是目录(或其他内容)。也许,在 pythonanywhere 使用的文件系统上,您需要先进行 stat 操作(stat_result.st_type 应该有效)。
编辑:在 os.scandir 上的讨论 中查看,DT_UNKNOWN 情况是通过再次进行 stat 处理的。我仍然会尝试确认这些检查是否按预期工作。

谢谢。我已经尝试过了,但是不起作用... 我想在这里粘贴代码,但它太长了。 - Rashomon

1
你可以尝试这个:

For 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)

语法错误... 那 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>... - Rashomon
我在print "%.2f MB"%(folder/MB)处得到了一个语法错误。无论如何,folder返回0 :( - Rashomon
如果我调用print(folder),终端会打印出“0”,并且不会出现错误。 - Rashomon
@flashter,所以你正在使用Python V3。只需将print()语句括起来,并尝试检查其他文件夹。如果答案满足您的需求,请接受(勾选)该答案。 - Shivkumar kondi

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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接