utils.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # coding: utf-8
  2. # 文件大小类
  3. from django.utils import six
  4. if six.PY3:
  5. long = int
  6. class FileSize():
  7. SIZE_UNIT = {"Byte": 1, "KB": 1024, "MB": 1048576, "GB": 1073741824, "TB": 1099511627776}
  8. def __init__(self, size):
  9. self.size = long(FileSize.Format(size))
  10. @staticmethod
  11. def Format(size):
  12. import re
  13. if isinstance(size, six.integer_types):
  14. return size
  15. else:
  16. if not isinstance(size, str):
  17. return 0
  18. else:
  19. oSize = size.lstrip().upper().replace(" ", "")
  20. pattern = re.compile(
  21. r"(\d*\.?(?=\d)\d*)(byte|kb|mb|gb|tb)", re.I)
  22. match = pattern.match(oSize)
  23. if match:
  24. m_size, m_unit = match.groups()
  25. if m_size.find(".") == -1:
  26. m_size = long(m_size)
  27. else:
  28. m_size = float(m_size)
  29. if m_unit != "BYTE":
  30. return m_size * FileSize.SIZE_UNIT[m_unit]
  31. else:
  32. return m_size
  33. else:
  34. return 0
  35. # 返回字节为单位的值
  36. @property
  37. def size(self):
  38. return self.size
  39. @size.setter
  40. def size(self, newsize):
  41. try:
  42. self.size = long(newsize)
  43. except:
  44. self.size = 0
  45. # 返回带单位的自动值
  46. @property
  47. def FriendValue(self):
  48. if self.size < FileSize.SIZE_UNIT["KB"]:
  49. unit = "Byte"
  50. elif self.size < FileSize.SIZE_UNIT["MB"]:
  51. unit = "KB"
  52. elif self.size < FileSize.SIZE_UNIT["GB"]:
  53. unit = "MB"
  54. elif self.size < FileSize.SIZE_UNIT["TB"]:
  55. unit = "GB"
  56. else:
  57. unit = "TB"
  58. if (self.size % FileSize.SIZE_UNIT[unit]) == 0:
  59. return "%s%s" % ((self.size / FileSize.SIZE_UNIT[unit]), unit)
  60. else:
  61. return "%0.2f%s" % (round(float(self.size) / float(FileSize.SIZE_UNIT[unit]), 2), unit)
  62. def __str__(self):
  63. return self.FriendValue
  64. # 相加
  65. def __add__(self, other):
  66. if isinstance(other, FileSize):
  67. return FileSize(other.size + self.size)
  68. else:
  69. return FileSize(FileSize(other).size + self.size)
  70. def __sub__(self, other):
  71. if isinstance(other, FileSize):
  72. return FileSize(self.size - other.size)
  73. else:
  74. return FileSize(self.size - FileSize(other).size)
  75. def __gt__(self, other):
  76. if isinstance(other, FileSize):
  77. if self.size > other.size:
  78. return True
  79. else:
  80. return False
  81. else:
  82. if self.size > FileSize(other).size:
  83. return True
  84. else:
  85. return False
  86. def __lt__(self, other):
  87. if isinstance(other, FileSize):
  88. if other.size > self.size:
  89. return True
  90. else:
  91. return False
  92. else:
  93. if FileSize(other).size > self.size:
  94. return True
  95. else:
  96. return False
  97. def __ge__(self, other):
  98. if isinstance(other, FileSize):
  99. if self.size >= other.size:
  100. return True
  101. else:
  102. return False
  103. else:
  104. if self.size >= FileSize(other).size:
  105. return True
  106. else:
  107. return False
  108. def __le__(self, other):
  109. if isinstance(other, FileSize):
  110. if other.size >= self.size:
  111. return True
  112. else:
  113. return False
  114. else:
  115. if FileSize(other).size >= self.size:
  116. return True
  117. else:
  118. return False