[英]python get file size of volumes or physical drives
I am opening a volume in Windows, like this: 我正在Windows中打开一个卷,如下所示:
open(filename, 'rb') where filename is r'\\\\.\d:'
The problem is that I need to get the size of the volume. 问题是我需要获取卷的大小。 I've tried:
os.sta
t, os.path.getsize
, seek/tell
nothing works, says invalid parameter or argument. 我试过:
os.sta
t, os.path.getsize
, seek/tell
什么都os.sta
,说无效的参数或参数。
I would need a way to get this without using win32 specific functions. 我需要一种无需使用Win32特定功能即可获得此功能的方法。
To do some calculation on the volume 对体积做一些计算
UNIX UNIX系统
Use os.statvfs
使用
os.statvfs
import os
statvfs = os.statvfs('/path/to/file/filename')
statvfs.f_frsize * statvfs.f_blocks # Size of filesystem in bytes
statvfs.f_frsize * statvfs.f_bfree # Actual number of free bytes
statvfs.f_frsize * statvfs.f_bavail # Number of bytes available for users
WINDOWS 视窗
For windows you can use the wmi
module or use ctypes
对于Windows,您可以使用
wmi
模块或ctypes
wmi WMI
import wmi
c = wmi.WMI ()
for d in c.Win32_LogicalDisk():
print(d.Caption, d.FreeSpace, d.Size, d.DriveType)
ctypes 类型
import ctypes
import os
# get directoryname from the file example:--> dirname = os.path.dirname()
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes))
print(free_bytes.value / 1024 / 1024)
I don't think this can be done properly without leveraging the Python Win32 API. 我认为,如果不利用Python Win32 API,就无法正确完成此操作。
Here is a Python Recipe ( GitHub ) to quickly calculate folder or volume size. 这是Python食谱 ( GitHub ),用于快速计算文件夹或卷的大小。 It uses the
win32file.FindFilesW()
function to efficiently calculate the total size of a folder or volume. 它使用
win32file.FindFilesW()
函数有效地计算文件夹或卷的总大小。 It also can handle cases where a cutoff size is desired or errors are encountered along the path. 它还可以处理需要截断尺寸或在路径上遇到错误的情况。
I've converted the function to Python 3: 我已将函数转换为Python 3:
## http://code.activestate.com/recipes/572179-quickly-calculate-folder-or-volume-size/
import win32file as _win32file
import sys as _sys
class FolderSize:
"""
This class implements an efficient technique for
retrieving the size of a given folder or volume in
cases where some action is needed based on a given
size.
The implementation is designed to handle situations
where a specific size is desired to watch for,
in addition to a total size, before a subsequent
action is taken. This dramatically improves
performance where only a small number of bytes
are sufficient to call off a search instead of
waiting for the entire size.
In addition, the design is set to handle problems
encountered at points during the search, such as
permission errors. Such errors are captured so that
a user could further investigate the problem and why
it occurred. These errors do not stop the search from
completing; the total size returned is still provided,
minus the size from folders with errors.
When calling a new search, the errors and total size
from the previous search are reset; however, the stop
size persists unless changed.
"""
def __init__(self):
# This is the total size returned. If a stop size
# is provided, then the total size will be the last
# bytes counted after the stop size was triggered.
self.totalSize = 0
# This mapping holds any errors that have occurred
# during the search. The key is the path name, and
# its value is a string of the error itself.
self.errors = {}
# This is the size where the search will end. The default
# is -1 and it represents no stop size.
self._stopSize = -1
# This prints verbose information on path names.
self.verbose = 0
def enableStopSize(self, size=0):
"""
This public method enables the stop size
criteria. If the number of bytes thus far
calculated exceeds this size, the search is
stopped.
The default value is zero bytes and means anything
greater will end the search.
"""
if type(size) != int:
print("Error: size must be an integer")
_sys.exit(1)
self._stopSize = size
def disableStopSize(self):
"""
This public method disables the stop size
criteria. When disabled, the total size of
a folder is retrieved.
"""
self._stopSize = -1
def showStopSize(self):
"""
This public method displays the current
stop size in bytes.
"""
print((self._stopSize))
def searchPath(self, path):
"""
This public method initiates the process
of retrieving size data. It accepts either
a UNC or local drive path.
"""
# Reset the values on every new invocation.
self.totalSize = 0
self.errors = {}
self._getSize(path)
def _getSize(self, path):
"""
This private method calculates the total size
of a folder or volume, and accepts a UNC or
local path.
"""
if self.verbose: print(path)
# Get the list of files and folders.
try:
items = _win32file.FindFilesW(path + "\\*")
except _win32file.error as details:
self.errors[path] = str(details[-1])
return
# Add the size or perform recursion on folders.
for item in items:
attr = item[0]
name = item[-2]
size = item[5]
if attr & 16:
if name != "." and name != "..":
self._getSize("%s\\%s" % (path, name))
self.totalSize += size
if self._stopSize > -1:
if self.totalSize > self._stopSize:
return
if __name__ == "__main__":
# Get the size of entire folder.
sizer = FolderSize()
sizer.searchPath(r"D:\_audiobooks")
print(sizer.totalSize)
# Enable stop size (in bytes). Default is zero if no arg provided.
sizer.enableStopSize(1024)
sizer.searchPath(r"D:\_audiobooks")
if sizer.totalSize > 1024:
print("The folder meets the criteria.")
elif sizer.totalSize == 0:
print("The folder is empty.")
else:
print("The folder has some data but can be skipped.")
# If the total size is zero, make sure no errors have occurred.
# It may mean the initial path failed. Otherwise, errors are always from
# subfolders.
if sizer.totalSize == 0 and sizer.errors:
print(sizer.errors)
If you want the output to be more human-readable, there is another Python Recipe for you (see also ): 如果你想输出更可读的,还有另外一个Python的食谱给你(见也 ):
print(bytes2human(sizer.totalSize))
3.9 G
use psutil module 使用psutil模块
import psutil
disk = psutil.disk_usage('/')
print(disk.total / (1024.0 ** 3))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.