utils.py 4.0 KB

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