def save_file(self, datafile): """ Ouvrir le fichier uploadé et créer les images contenues :param datafile: nom du fichier d'archive ou handle de fichier """ if isinstance(datafile, str): datafile = open(datafile, 'r') content_type = datafile.content_type if content_type in { 'application/zip', 'application/x-zip-compressed', 'application/x-rar-compressed' }: if content_type in {'application/x-rar-compressed'}: archive = RarFile(datafile, 'r') else: archive = ZipFile(datafile, 'r') names = archive.namelist() for name in names: filename, fileext = os.path.splitext(name.lower()) if fileext in ('.png', '.jpg', '.jpeg'): item = archive.open(name) with NamedTemporaryFile(prefix=slugify(filename), suffix=fileext, delete=False) as tfile: tfile.write(item.read()) picture = Picture(author=self.request.user) picture.image.save(tfile.name, File(tfile)) picture.save() item.close() archive.close() datafile.close() return self.cleaned_data else: raise forms.ValidationError(_("File must be a zip or rar file"))
class RarFileExtractor(Extractor): def __init__(self, archive_path: str): self.archive_path = archive_path self.rarfile = RarFile(self.archive_path) self.namelist = { i.filename for i in self.rarfile.infolist() if not i.isdir() } def __exit__(self, *args): self.rarfile.close() def list_files(self) -> {}: return self.namelist def extract(self, file_name: str, dest_path: str, write_hook: Callable[[bytes], bytes] = None): with self.rarfile.open(file_name) as rf, open(dest_path, 'wb') as out: while True: chunk = rf.read(CHUNKSIZE) if not chunk: break out.write(write_hook(chunk) if write_hook else chunk)
def __extract_cbr(self, file): """ extract first image in cbr file, cache it in local cache folder""" try: archive_rar = RarFile(file, 'r') extract_path = self.cache + path.basename(file) if self.mode is 'all': archive_rar.extractall(path=extract_path) else: first_file = archive_rar.namelist()[0] archive_rar.extract(member=first_file, path=extract_path) except BadRarFile as e: raise e finally: archive_rar.close() return extract_path
class RarArchive(BaseArchive): def __init__(self, file): self._archive = RarFile(file) def namelist(self): return self._archive.namelist() def filenames(self): return self._archive.namelist() def close(self): return self._archive.close() def is_encrypted(self): return self._archive.needs_password() def extraxt(self): rarfile = rarfile.RarFile.self._archive rarfile.extraxt(self._archive._rarfile) def extractall(self, file): return self._archive.extractall(file) def list(self, *args, **kwargs): self.printdir(*args, **kwargs) def printdir(self, file=None): """Print a table of contents for the zip file.""" print("%-46s %19s %12s" % ("File Name", "Modified ", "Size"), file=file) for file_ in self._archive._file_parser.infolist(): date = "%d-%02d-%02d %02d:%02d:%02d" % file_.date_time[:6] print("%-46s %s %12d" % (file_.filename, date, file_.file_size), file=file)
def extract_rar(self,tarfile_fullpath, delete_tar_file=DELETE,Path=True): tarfile_name = os.path.basename(tarfile_fullpath) parent_dir = os.path.dirname(tarfile_fullpath) extract_folder_name = tarfile_name[:-1*len(self.fileExtension(tarfile_name))-1] if Path: if self.extract_path: extract_folder_fullpath = os.path.join(self.extract_path, extract_folder_name) else: extract_folder_fullpath = os.path.join(parent_dir,"archivedFiles", extract_folder_name) else: extract_folder_fullpath = os.path.join(parent_dir, extract_folder_name) try: rar = RarFile(tarfile_fullpath, "r") rar.extractall(extract_folder_fullpath) rar.close() if delete_tar_file: os.remove(tarfile_fullpath) return extract_folder_fullpath except Exception as e: # Exceptions can occur while opening a damaged tar file. print 'Error occured while extracting %s\n'\ 'Reason: %s' %(tarfile_fullpath, e) return
def unrar( filename, destination=None, report=False ): from rarfile import RarFile base_dir = "" if destination is None: destination = os.path.dirname( filename ) try: rar = RarFile( filename, "r" ) namelist = rar.namelist() total_items = len( namelist ) or 1 diff = 100.0 / total_items percent = 0 # nom du dossier racine root_dir = namelist[ -1 ] is_root_dir = True # si root_dir n'est pas un dossier ou n'est pas la racine, on se base sur le nom de l'archive #print root_dir if not rar.getinfo( root_dir ).isdir(): is_root_dir = False else: for i in namelist: #print root_dir in i, i if not root_dir in i: is_root_dir = False break if not is_root_dir:#rar.getinfo( root_dir ).isdir(): root_dir = os.path.basename( os.path.splitext( filename )[ 0 ] ) base_dir = os.path.join( destination, root_dir ) if os.path.isdir( base_dir ): shutil2.rmtree( base_dir ) os.makedirs( base_dir ) time_sleep = get_time_sleep( filename ) # avec cette methode on extract dans le dossier ou est l'archive ok = executebuiltin( 'XBMC.Extract(%s)' % ( filename, ) ) #sleep une seconde ou plus selon la drosseur du fichier le temps que le builtin est fini car l'action suivante # "os.listdir" est excecuter avant la fin du builtin sleep( time_sleep ) # si le dossier base_dir est vide on move les items de namelist dedans if not os.listdir( base_dir ): for item in namelist: src = os.path.normpath( os.path.join( os.path.dirname( filename ), item ) ) dst = os.path.normpath( os.path.join( base_dir, item ) ) if not rar.getinfo( item ).isdir(): if not os.path.isdir( os.path.dirname( dst ) ): os.makedirs( os.path.dirname( dst ) ) shutil2.move( src, dst, overwrite=True ) elif os.path.exists( src ) and not os.listdir( src ): shutil2.rmtree( src ) #maintenant on verifier l'extraction d'xbmc avec la liste de la lib rarfile if os.path.isdir( base_dir ): size = 0 list_size = 0 if not root_dir in namelist: list_size -= 1 namelist = [ os.path.split( item )[ 1 ] for item in namelist ] for root, dirs, files in os.walk( base_dir, topdown=False ): percent += diff list_size += 1 for file in files: percent += diff list_size += 1 if report: if DIALOG_PROGRESS.iscanceled(): break DIALOG_PROGRESS.update( int( percent ), Language( 187 ) % ( list_size, total_items ), file, Language( 110 ) ) #print round( percent, 2 ), file if file in namelist: size += os.path.getsize( os.path.join( root, file ) ) else: print "Error %s est dans la liste de depart!" % file #print size if not size: print "Error for extracting rar: %s" % filename rar.close() del rar # si list_size est pas declarer une erreur automatique est creer ;) return base_dir, list_size == total_items except: print_exc() return "", False
def unrar(filename, destination=None, report=False): from rarfile import RarFile base_dir = "" if destination is None: destination = os.path.dirname(filename) try: rar = RarFile(filename, "r") namelist = rar.namelist() total_items = len(namelist) or 1 diff = 100.0 / total_items percent = 0 # nom du dossier racine root_dir = namelist[-1] is_root_dir = True # si root_dir n'est pas un dossier ou n'est pas la racine, on se base sur le nom de l'archive if not rar.getinfo(root_dir).isdir(): is_root_dir = False else: for i in namelist: #print root_dir in i, i if not root_dir in i: is_root_dir = False break if not is_root_dir: #rar.getinfo( root_dir ).isdir(): root_dir = os.path.basename(os.path.splitext(filename)[0]) base_dir = os.path.join(destination, root_dir) if os.path.isdir(base_dir): shutil2.rmtree(base_dir) os.makedirs(base_dir) time_sleep = get_time_sleep(filename) # avec cette methode on extract dans le dossier ou est l'archive ok = executebuiltin('XBMC.Extract(%s)' % (filename, )) #sleep une seconde ou plus selon la drosseur du fichier le temps que le builtin est fini car l'action suivante # "os.listdir" est excecuter avant la fin du builtin sleep(time_sleep) # si le dossier base_dir est vide on move les items de namelist dedans if not os.listdir(base_dir): for item in namelist: src = os.path.normpath( os.path.join(os.path.dirname(filename), item)) dst = os.path.normpath(os.path.join(base_dir, item)) if not rar.getinfo(item).isdir(): if not os.path.isdir(os.path.dirname(dst)): os.makedirs(os.path.dirname(dst)) shutil2.move(src, dst, overwrite=True) elif os.path.exists(src) and not os.listdir(src): shutil2.rmtree(src) #maintenant on verifier l'extraction d'xbmc avec la liste de la lib rarfile if os.path.isdir(base_dir): size = 0 list_size = 0 if not root_dir in namelist: list_size -= 1 namelist = [os.path.split(item)[1] for item in namelist] for root, dirs, files in os.walk(base_dir, topdown=False): percent += diff list_size += 1 for file in files: percent += diff list_size += 1 if report: if DIALOG_PROGRESS.iscanceled(): break DIALOG_PROGRESS.update( int(percent), _(30187) % (list_size, total_items), file, _(30110)) #print round( percent, 2 ), file if file in namelist: size += os.path.getsize(os.path.join(root, file)) else: print "Error %s est dans la liste de depart!" % file #print size if not size: print "Error for extracting rar: %s" % filename rar.close() del rar # si list_size est pas declarer une erreur automatique est creer ;) return base_dir, list_size == total_items except: print_exc() return "", False
def downloader(code, key): newDir() error = exist = 0 isError = isExist = '' nameList = listdir('PPT') extensions = [] print('读取成功!开始下载') pools = Semaphore(4) threads = [] def down(e): with pools: downFilename = key + code[e] if judgeFile(downFilename, nameList) == -1: return 0 try: downloadUrl = processor(code[e]) extensions.append(downloadUrl[len(downloadUrl) - 4:len(downloadUrl)]) with open('temp\\{}.temp'.format(downFilename), 'wb') as f: f.write(_get(downloadUrl, verify=False).content) except: pass for each in range(len(code)): threads.append(Thread(target=down, args=(each, ))) for each in threads: each.start() for each in range(len(threads)): showBar(each + 1, len(code) + 1) threads[each].join() print('\n下载完毕!正在解压') for each in range(len(code)): showBar(each + 1, len(code) + 1) filename = key + code[each] judgeCode = judgeFile(filename, nameList, False) if judgeCode == -1: exist = exist + 1 continue extension = extensions[each] try: move('temp\\{}.temp'.format(filename), 'PPT\\{}{}'.format(filename, extension)) if extension == '.rar': package = RarFile('PPT\\{}.rar'.format(filename)) elif extension == '.zip': package = ZipFile('PPT\\{}.zip'.format(filename)) else: print('\r{}{}解压失败,格式不支持。{}'.format(filename, extension, ' ' * 5)) error = error + 1 continue name = package.namelist()[0] package.extractall('PPT') package.close() try: rename('PPT\\{}'.format(name), 'PPT\\{}{}'.format(filename, name)) except: pass except: print('\r{}{}解压失败,找不到文件。{}'.format(filename, extension, ' ' * 5)) error = error + 1 print('\n下载成功!处理文件中。。。') for each in listdir('PPT'): if path.splitext(each)[1] != '.ppt' and path.splitext( each)[1] != '.pptx' and not path.isdir('PPT\\' + each): remove('PPT\\' + each) if error > 0: isError = ',{}个错误'.format(error) if exist > 0: isExist = ',{}个文件已存在。'.format(exist) print('PPT下载成功,共{}个{}{}'.format(len(code), isError, isExist)) while True: pass