虽然以下代码在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"))
答案 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/"))
需要完整的路径!