Organizador de directorio: Organización de un directorio determinado moviendo archivos en categorías de acuerdo con su tipo -- python campo con beginner campo con object-oriented campo con python-3.x campo con file-system camp codereview Relacionados El problema

Directory Organizer: Organizing a given directory by moving files into categories according to their type


6
vote

problema

Español

My Windows Desktop está desordenado con muchos archivos de diferentes tipos aquí y, por lo tanto, pensé en escribir un programa para organizarlo, y otros directorios también, para mí. Aquí está mi código:

  import os import shutil   class File:     """Represents a computer file.      attributes: path, name, extension     """     def __init__(self, path):         """Inintializes a File object.          file_path: str         """                 if os.path.isfile(path):             self.path = path             self.name = os.path.basename(path)             self.extension = os.path.splitext(self.path)[1].lower()         else:             raise FileNotFoundError("This is not a valid file")      def is_document(self):         """Returns whether file is a document."""         extensions = ('.htm', '.docx', '.docm', '.doc', '.dotx',                     '.dotm', '.pdf', '.xps', '.rtf',                     '.txt', '.xml', '.odt', '.wps', '.accdb',                     '.mdb', '.adp', '.xlsx', '.xlsm', '.xls',                     '.xlsb', '.xltx', '.xltm', '.xlt', '.htm'                     '.csv', '.prn', '.dif', '.ods', '.xlam',                     '.slk', '.pptx', '.pptm', '.ppt', '.potx',                     '.potm', '.pot', '.ppsx', '.ppsm', '.epub')         return self.extension in extensions      def is_photo(self):         """Returns whether file is a photo."""         extensions = ('.png', '.jpeg', '.jpg')         return self.extension in extensions      def is_media(self):         """Returns whether file is a media file."""         extensions = ('.mp3', '.mp4', '.flv', '.amr', '.mpg', '.avi', '.mov', '.webm', '.rm')         return self.extension in extensions      def is_executable(self):         """Returns whether file is an exeutable."""         return self.extension == '.exe'      def is_archive(self):         """Returns whether file is a compressed file."""         extensions = ('.rar', '.zip')         return self.extension in extensions      def type(self):         """Returns a string representing the type of file."""         if self.is_document():             return 'document'         elif self.is_photo():             return 'photo'         elif self.is_media():             return 'media'         elif self.is_executable():             return 'executable'         elif self.is_archive():             return 'archive'         else:             return 'other'      def move(self, other):         """Moves the file to a given directory."""         Folder(other)          try:             shutil.move(self.path, other)          except:                    print('Was not moved successfully: ', self.path)             print()   class Folder:     """Represents a computer folder.      attributes: path, name     """     def __init__(self, path):         """Initializes a Folder object.          path: str         """          if not os.path.isdir(path):             raise FileNotFoundError(path + ' is not a valid directory')          else:             self.path = path             self.name = os.path.basename(path)       def is_empty(self):         """Returns whether a folder is empty."""         return os.listdir(self.path) == []   def dir_path(message):     """Asks the user to enter a string specifing     a directory.      message: str      Returns: str     """         while True:         dir_path = input(message)          print('')          if os.path.isdir(dir_path):             return dir_path          print('Not a valid directory. Try again. ')   def move_files(source, target):     """Moves files in a given directory to folders working as     categories, based on their type."""     Folder(source)     Folder(target)      categories = ('Document', 'Executable', 'Archive', 'Media', 'Photo', 'Other')     create_folders(target, categories)      for item in os.listdir(source):         full_path = os.path.join(source, item)         if os.path.isfile(full_path):             file = File(full_path)             category = os.path.join(target, file.type().title())              print('Move: ', full_path)             print()              file.move(category)   def create_folders(directory, names):     """Creates one or more folders in a given directory."""     target = Folder(directory)      try:         for name in names:             full_path = os.path.join(directory, name)             os.mkdir(full_path)      except FileExistsError:         print(full_path, ': Exists already')   def main():                 source = dir_path('Path of directory to organize: ')     name = 'Directory Organizer'     target = os.path.join(source, name)         create_folders(source, (name,))     move_files(source, target)      print(' Done')   if __name__ == '__main__':     main()   

Además de obtener mi código revisado, tengo algunas preguntas sobre ella:

  • ¿Debería en create_folders Uso pass en lugar de imprimir un mensaje?

  • Pensé en escribir una función que categorizará los archivos existentes en un directorio dado según su tipo. Y devolverá un diccionario en el que la tecla es una cadena que representa una categoría y valor es una lista de cadenas que representan rutas de archivos que pertenecen a esta categoría. Luego, otra función atravesará este diccionario y se moverá archivos. Pero pensé que esto simplemente disminuirá mi código. ¿Será esto mejor?

  • ¿Debería preocuparme por los errores de nenegrafía de "" ?

  • Siento que move_files no es lo suficientemente bueno. ¿Estoy en lo cierto? Si es así, ¿cómo debería refactorarse?

Original en ingles

My Windows desktop is messy with many files of different types here and there, therefore I thought of writing a program to organize it, and other directories too, for me. Here is my code:

import os import shutil   class File:     """Represents a computer file.      attributes: path, name, extension     """     def __init__(self, path):         """Inintializes a File object.          file_path: str         """                 if os.path.isfile(path):             self.path = path             self.name = os.path.basename(path)             self.extension = os.path.splitext(self.path)[1].lower()         else:             raise FileNotFoundError("This is not a valid file")      def is_document(self):         """Returns whether file is a document."""         extensions = ('.htm', '.docx', '.docm', '.doc', '.dotx',                     '.dotm', '.pdf', '.xps', '.rtf',                     '.txt', '.xml', '.odt', '.wps', '.accdb',                     '.mdb', '.adp', '.xlsx', '.xlsm', '.xls',                     '.xlsb', '.xltx', '.xltm', '.xlt', '.htm'                     '.csv', '.prn', '.dif', '.ods', '.xlam',                     '.slk', '.pptx', '.pptm', '.ppt', '.potx',                     '.potm', '.pot', '.ppsx', '.ppsm', '.epub')         return self.extension in extensions      def is_photo(self):         """Returns whether file is a photo."""         extensions = ('.png', '.jpeg', '.jpg')         return self.extension in extensions      def is_media(self):         """Returns whether file is a media file."""         extensions = ('.mp3', '.mp4', '.flv', '.amr', '.mpg', '.avi', '.mov', '.webm', '.rm')         return self.extension in extensions      def is_executable(self):         """Returns whether file is an exeutable."""         return self.extension == '.exe'      def is_archive(self):         """Returns whether file is a compressed file."""         extensions = ('.rar', '.zip')         return self.extension in extensions      def type(self):         """Returns a string representing the type of file."""         if self.is_document():             return 'document'         elif self.is_photo():             return 'photo'         elif self.is_media():             return 'media'         elif self.is_executable():             return 'executable'         elif self.is_archive():             return 'archive'         else:             return 'other'      def move(self, other):         """Moves the file to a given directory."""         Folder(other)          try:             shutil.move(self.path, other)          except:                    print('Was not moved successfully: ', self.path)             print()   class Folder:     """Represents a computer folder.      attributes: path, name     """     def __init__(self, path):         """Initializes a Folder object.          path: str         """          if not os.path.isdir(path):             raise FileNotFoundError(path + ' is not a valid directory')          else:             self.path = path             self.name = os.path.basename(path)       def is_empty(self):         """Returns whether a folder is empty."""         return os.listdir(self.path) == []   def dir_path(message):     """Asks the user to enter a string specifing     a directory.      message: str      Returns: str     """         while True:         dir_path = input(message)          print('')          if os.path.isdir(dir_path):             return dir_path          print('Not a valid directory. Try again.\n')   def move_files(source, target):     """Moves files in a given directory to folders working as     categories, based on their type."""     Folder(source)     Folder(target)      categories = ('Document', 'Executable', 'Archive', 'Media', 'Photo', 'Other')     create_folders(target, categories)      for item in os.listdir(source):         full_path = os.path.join(source, item)         if os.path.isfile(full_path):             file = File(full_path)             category = os.path.join(target, file.type().title())              print('Move: ', full_path)             print()              file.move(category)   def create_folders(directory, names):     """Creates one or more folders in a given directory."""     target = Folder(directory)      try:         for name in names:             full_path = os.path.join(directory, name)             os.mkdir(full_path)      except FileExistsError:         print(full_path, ': Exists already')   def main():                 source = dir_path('Path of directory to organize: ')     name = 'Directory Organizer'     target = os.path.join(source, name)         create_folders(source, (name,))     move_files(source, target)      print('\nDone')   if __name__ == '__main__':     main() 

In addition to getting my code reviewed I have some questions regarding it:

  • Should I in create_folders use pass instead of printing a message?

  • I thought of writing a function that will categorize files existing in a given a directory based on their type. And will return a dictionary in which key is a string representing a category and value is a list of strings representing paths of files that belong to this category. Then another function will traverse this dictionary and move files. But I thought that this will just slow my code down. Will this be better?

  • Should I care about "access denied errors"?

  • I feel that move_files is not good enough. Am I right? If so how should it be refactored?

              

Lista de respuestas

2
 
vote

Hay mucha repetición en la forma en que determina el tipo de archivo. Además, este enfoque no se escala bien. ¿Qué sucede si tendría un diccionario de los nombres de tipo de archivo como las llaves y una > fclose()7 de extensiones como valores que usted se transformará dinámicamente en un mapa entre una extensión y un tipo de archivo:

  fclose()8  

Ahora, el método fclose()9655443369 se vería:

  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define SIZE 1024  int main(void) {     const char filename[] = "test";     FILE *in_file;     char buffer[SIZE + 1], lastchar = ' ';     size_t bytes;     int lines = 0;      if (NULL == (in_file = fopen(filename, "r"))) {         perror(filename);         return EXIT_FAILURE;     }      while ((bytes = fread(buffer, 1, sizeof(buffer) - 1, in_file))) {         lastchar = buffer[bytes - 1];         for (char *c = buffer; (c = memchr(c, ' ', bytes - (c - buffer))); c++) {             lines++;         }     }     if (lastchar != ' ') {         lines++;  /* Count the last line even if it lacks a newline */     }     if (ferror(in_file)) {         perror(filename);         fclose(in_file);         return EXIT_FAILURE;     }      fclose(in_file);     printf("Number of lines in the file is %i ", lines); } 0  

y usted no necesitaría todos los métodos 99887766655443371 .

 

There is quite a lot of repetition in the way you determine the file type. Plus, this approach does not scale well. What if you would have a dictionary of file type names as keys and a frozenset of extensions as values which you would dynamically transform into a map between an extension and a file type:

TYPE_EXTENSIONS = {     'document': frozenset(['.htm', '.docx', '.docm', '.doc', '.dotx',                            '.dotm', '.pdf', '.xps', '.rtf',                            '.txt', '.xml', '.odt', '.wps', '.accdb',                            '.mdb', '.adp', '.xlsx', '.xlsm', '.xls',                            '.xlsb', '.xltx', '.xltm', '.xlt', '.htm'                            '.csv', '.prn', '.dif', '.ods', '.xlam',                            '.slk', '.pptx', '.pptm', '.ppt', '.potx',                            '.potm', '.pot', '.ppsx', '.ppsm', '.epub']),     'photo': frozenset(['.png', '.jpeg', '.jpg']),     'media': frozenset(['.mp3', '.mp4', '.flv', '.amr', '.mpg', '.avi', '.mov', '.webm', '.rm']),     'executable': frozenset(['.exe']),     'archive': frozenset(['.rar', '.zip']) }  EXTENSION_TYPES = {value: key                     for value in values                    for key, values in TYPE_EXTENSIONS.items()} 

Now, the type() method would simply look like:

def type(self):     """Returns a string representing the type of file."""     return EXTENSION_TYPES.get(self.extension, 'other') 

And you would not need all the is_*() methods anymore.

 
 
   
   

Relacionados problema

5  Mejorar este navegador de archivos de imagen (eliminar la redundancia)?  ( Improve this image file browser remove redundancy ) 
Déjame comenzar diciendo que el código funciona como es, pero creo que tiene mucha redundancia. Está escrito de esta manera, ya que seguí recibiendo nullpoint...

5  Selector y reproductor de MP3 aleatorio  ( Random mp3 selector and player ) 
Entonces, soy un glotón para el castigo, o no tengo vida, pero yo escribió un script para responder una pregunta sobre Preguntar en preguntar Ubuntu como sol...

4  ¿Hay una manera 'mejor' de encontrar archivos de una lista en un árbol de directorios  ( Is there a better way to find files from a list in a directory tree ) 
He creado una lista de archivos usando find , 9988776655544336 . El comando Buscar es simplemente find . -type f -name "<search_pattern>" > foundlist.lst...

8  Extractor simple para Archivos de Pak de Quake-2  ( Simple extractor for quake 2 pak archives ) 
Estaba jugando con el código fuente de Quake-2 hoy y en algún punto desea extraer archivos de El .pak Archivos utilizados por el juego. Dado que no pude e...

2  Estantería con clasificación, categorías y archivo E / S  ( Bookshelf with sorting categories and file i o ) 
He estado trabajando en un proyecto originalmente para la escuela con respecto al diseño orientado a objetos, donde se suponía que debía escribir una clase pa...

2  Fusionar directorios y mantener archivos que tengan más líneas  ( Merging directories and keep files that have more lines ) 
gol Mi objetivo es combinar directorios. Cada vez que un archivo tiene el mismo nombre en dos o más directorios, solo se debe mantener el número más alto ...

5  Colector de archivos M3U  ( M3u file collector ) 
Soy nuevo en Python y escribió este código para recopilar todos los archivos en un archivo M3U (Lista de reproducción) y copiándolos en un directorio. impo...

6  Compara el último tiempo de modificación con tiempo especificado  ( Compare last modification time with specfied time ) 
Estoy escribiendo una función en Python que compara el tiempo de modificación de un archivo en Linux (usando OS.STAT) con un tiempo específico y compare las f...

1  Foldify - Una herramienta de carpeta de Python Tree Tree  ( Foldify a python folder tree manager tool ) 
El objetivo era crear una herramienta para ayudar a administrar las estructuras de las carpetas y permitirme crear plantillas de estas carpetas y almacenarlas...

2  Clase PHP para el manejo de archivos y la creación  ( Php class for file handling and creation ) 
Esta es una clase muy simple para manejar archivos. Permite acceder, crear y modificar archivos en el sistema o 2 archivos falsos (uno en la memoria y otros...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos