def download(url, out_put_path, chunk_size=1024, user=None, password=None): ''' out_put_path 可以是一个目录 也可以是文件路径 ''' u = urlopen(url) meta = u.info() dest_file = out_put_path if os.path.isdir(out_put_path): name = meta.get_filename() if name is None: name = url.split('/')[-1] dest_file = os.path.join(out_put_path, name) tmp_path = dest_file + '.tmp' file_name = os.path.basename(dest_file) size_str = meta['Content-Length'] file_size = -1 if size_str: file_size = int(size_str) if file_size > 0: human_file_size = '{:.03Hc}'.format(FileSize(file_size)) content_type = meta['Content-Type'] print("url is %s" % u.geturl()) if file_size > 0: print("Length is %d (%s) [%s]" % (file_size, human_file_size, content_type)) else: print("Length unspecified [%s]" % (content_type)) print("Saveing to: %s" % dest_file) download_size = 0 with open(tmp_path, 'wb') as f: pbar = tqdm( total=file_size, unit='B', unit_scale=True, unit_divisor=1024, miniters=1) pbar.set_description('%s ' % file_name) while True: chunk = u.read(chunk_size) if not chunk: break download_size += len(chunk) pbar.update(len(chunk)) f.write(chunk) pbar.close() if file_size > 0 and download_size != file_size: raise DownloadFileException() os.rename(tmp_path, dest_file) return dest_file
def test_str_format(self): self.assertEqual('{:d}'.format(FileSize(1024)), '1024') self.assertEqual('{:.02fH}'.format(FileSize(1024)), '1 KB') self.assertEqual('{:.02fhs}'.format(FileSize(1000)), '1 KB') self.assertEqual('{:.02fhs^0}'.format(FileSize(1000)), '1000 B') self.assertEqual('{:.02fHcv}'.format(FileSize(1024)), '1 kilobyte') self.assertEqual('{: >10.02fH}'.format(FileSize(1024)), '1 KB'.rjust(10))
def negated_message(self, attribute): messages = [] if self.file_check: messages.append("The {} is a valid file.".format(attribute)) if self.size_check: from hfilesize import FileSize messages.append( "The {} file size is less or equal than {:.02fH}.".format( attribute, FileSize(self.size))) if self.mimes_check: messages.append("The {} mime type is in {}.".format( attribute, ",".join(self.allowed_extensions))) return messages
def negated_message(self, attribute): messages = [] if self.file_check: messages.append("The {} is a valid file.".format(attribute)) if self.size_check: from hfilesize import FileSize messages.append( "The {} file size is less or equal than {:.02fH}.".format( attribute, FileSize(self.size))) if self.mimes_check: messages.append("The {} file is a valid image.".format(attribute)) return messages
def message(self, attribute): messages = [] if not self.file_check: messages.append("The {} is not a valid file.".format(attribute)) if not self.size_check: from hfilesize import FileSize messages.append("The {} file size exceeds {:.02fH}.".format( attribute, FileSize(self.size))) if not self.mimes_check: messages.append( "The {} mime type is not valid. Allowed formats are {}.". format(attribute, ",".join(self.allowed_extensions))) return messages
def test_format(self): # base guessing self.assertEqual(FileSize(1024).format(size_fmt=Format.casing), '1 KB') with self.assertRaises(ValueError): self.assertEqual(FileSize(1024).format(size_fmt=Format.si), '1 KB') # plural self.assertEqual( FileSize(0).format(base=1024, size_fmt=Format.casing), '0 bytes') self.assertEqual( FileSize(1).format(base=1024, size_fmt=Format.casing), '1 byte') self.assertEqual( FileSize(2).format(base=1024, size_fmt=Format.casing), '2 bytes') self.assertEqual( FileSize(1024).format(base=1024, size_fmt=Format.casing_verbose), '1 kilobyte') self.assertEqual( FileSize(1025).format(base=1024, size_fmt=Format.casing_verbose), '1.00 kilobytes') self.assertEqual( FileSize(2048).format(base=1024, size_fmt=Format.casing_verbose), '2 kilobytes') # float formatting self.assertEqual( FileSize(1024).format(base=1024, size_fmt=Format.casing), '1 KB') self.assertEqual( FileSize(1025).format(base=1024, size_fmt=Format.casing), '1.00 KB') self.assertEqual( FileSize(2048).format(base=1024, size_fmt=Format.casing), '2 KB') # exponent self.assertEqual( FileSize(1024).format(base=1024, size_fmt=Format.casing, exponent=0), '1024 bytes') # exponent bounds check with self.assertRaises(ValueError): FileSize(1024).format(base=1024, size_fmt=Format.casing, exponent=100) with self.assertRaises(ValueError): FileSize(1024).format(base=1024, size_fmt=Format.casing, exponent=-1)
def test_parse(self): # basic tests on integers with no units self.assertEqual(FileSize(), 0) self.assertEqual(FileSize(1), 1) self.assertEqual(FileSize('1'), 1) self.assertEqual(FileSize('-1'), -1) # int base self.assertEqual(FileSize('0x12', 16), 0x12) # case sensitive self.assertEqual(FileSize('1k'), 1000) self.assertEqual(FileSize('1K'), 1024) self.assertEqual(FileSize('1kib'), 1024) self.assertEqual(FileSize('1kIB'), 1024) self.assertEqual(FileSize('1kb'), 1000) self.assertEqual(FileSize('1kB'), 1000) self.assertEqual(FileSize('1Kb'), 1024) self.assertEqual(FileSize('1KB'), 1024) self.assertEqual(FileSize('1k'), 1000**1) self.assertEqual(FileSize('1m'), 1000**2) self.assertEqual(FileSize('1g'), 1000**3) self.assertEqual(FileSize('1t'), 1000**4) self.assertEqual(FileSize('1p'), 1000**5) self.assertEqual(FileSize('1e'), 1000**6) self.assertEqual(FileSize('1z'), 1000**7) self.assertEqual(FileSize('1y'), 1000**8) self.assertEqual(FileSize('1K'), 1024**1) self.assertEqual(FileSize('1M'), 1024**2) self.assertEqual(FileSize('1G'), 1024**3) self.assertEqual(FileSize('1T'), 1024**4) self.assertEqual(FileSize('1P'), 1024**5) self.assertEqual(FileSize('1E'), 1024**6) self.assertEqual(FileSize('1Z'), 1024**7) self.assertEqual(FileSize('1Y'), 1024**8) # case insensitive self.assertEqual( FileSize('1K', default_binary=False, case_sensitive=False), 1000**1) self.assertEqual( FileSize('1K', default_binary=True, case_sensitive=False), 1024**1) # spacing self.assertEqual(FileSize('1 k'), 1000) # invalid values with self.assertRaises(ValueError): FileSize(1.1) with self.assertRaises(ValueError): FileSize('1.1') with self.assertRaises(ValueError): FileSize('1kibb')
def parse_size(size): """Parse humanized size into bytes""" from hfilesize import FileSize return FileSize(size, case_sensitive=False)
def phpDownLoaderProgress(self, name, done, bps): speed = 'Speed: ' + '{:.02fH}'.format(FileSize(bps)) + '/S' self.statusbar.showMessage('{} | {}'.format(name, speed), 20000) self.progressBar.setValue(done)