Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/08/2012, à 05:34

peyo56

[PYTHON] Gestion de fichiers universels dans un programme

Bonjour, je suis à la recherche d'une bonne gestion de fichiers et de conteneurs tout type pour python, j'ai deja commencé a en creer un moi meme, mais c'est relativement complexe.

Le principe est simple, on instancie une classe qui represente un fichier dans son type, puis on fait des manipulations a l'interieur ...

La classe d'un type est definie comme cela :

class Generic:
  Priority = 0 # Permet de definir la priorité du type dans le cas où lors de la détection du type, celui qui as l'indice le plus élevé soit prioritaire
  def open( self, object, path):
    """Permet d'ouvrir un fichier qui existe a partir de object de type file ou de path dans les cas de dossier. 
    Le mode ( lecture ou écriture ) est a déterminer à partir du mode de object
    """
  def create( self, path):
    """Permet de creer un fichier qui existe. pour l'emplacement path"""
  def read( self, name ):
    """Permet de lire un fils par sa clé.
    A utiliser dans le cas de conteneur tels des zip, rar, yaml, xml, json mais aussi des dossiers
    """
    return str( binary_content )
  def write( self, name,  ):
    """Permet d'ecrire un fils par sa clé.
    A utiliser dans le cas de conteneur tels des zip, rar, yaml, xml, json mais aussi des dossiers
    """
  def delete( self, name ):
    """Permet de detruire un fils par sa clé.
    A utiliser dans le cas de conteneur tels des zip, rar, yaml, xml, json mais aussi des dossiers
    """
  def get( self ):
    """Permet d'obtenir le contenu brut du fichier.
    À utiliser lorsque l'on souhaite obtenir le contenu afin de le placer dans un conteneur de type archive
    """
    return str( binary_content )
  def set( self, binary_content ):
    """Permet de definir le contenu brut du fichier.
    À utiliser lorsque l'on souhaite remplacer completement le contenu par un nouveau.
    """
  def list( self ):
    """Permet d'obtenir l'index du fichier.
    Un index n'est disponble que si :
     - le fichier a plusieurs contenus diferent et séparés
     - chaque contenu est accessible par une clé
     - pour chaque clé, il ne corespond qu'un unique contenu
    """
    return list( index )
  @staticmethod
  def detect( object, path ):
    """Permet de detecter si l'objet est de ce type"""
    return bool( istype )

les types sur lequels je travaille en ce moment sont ( principalement des conteneur ):

  1. Generic : fichiers binaire ou texte

  2. Zip : archive indexable

  3. Rar : archive indexable

  4. Tar : archive indexable

  5. 7zip : compression contenu non indexable

  6. Lzma : compression contenu non indexable

  7. Gzip : compression contenu non indexable

  8. Bzip : compression contenu non indexable

  9. Yaml : conteneur serialisé indexable

  10. Json : conteneur serialisé indexable

  11. Xml : conteneur serialisé indexable

  12. Dir : dossier ( permet de se placer dans un dossier comme l'on se placerait dans une archive, l'utilisation de raccourcis comme .. . ~ sont interdits)

  13. VirtualDir : dossier d'une archive

Avec cela on pourrait théoriquement pouvoir accéder, lire et écrire des contenus se trouvant dans des archives récursivement quelqu’un soit leur type. afin d'assurer une compatibilité avec windows, les / sont convertis en \ selon la nécessite.

ensuite le principe est simple, chacune des méthodes suivantes une fois programmées devront pouvoir fonctionner automatiquement comme suit :

copy( ['/home/user', '/.share/test', '/myfile.zip', '/included.xml'], ['/home/user', '/.share/test', '/excluded.xml'] ) # copie de /included.xml se trouvant dedans /home/user/.share/test/myfile.zip dans /home/user/.share/test/excluded.xml
delete( ['/home/user', '/.share/test', '/myfile.tar.gz', '/adir', '/asdir/included.xml']) # supprime /adir/asdir/included.xml se trouvant dedans /home/user/.share/test/myfile.tar.gz

Ce que je souhaiterait c'est pouvoir me baser sur quelque chose qui a la rigueur existerait déjà, si des personnes sont intéressées je passerait le lien de mon git pour qu'ils puissent voir.

Dernière modification par peyo56 (Le 14/08/2012, à 05:36)


Installation simple : Windows Vista 1h48 - Ubuntu Maverick 0h27
Instalation complete: Windows Vista ... - Ubuntu Maverick 2h
Comme quoi, Il y en a qui choisissent trop vite mais pas pour le plus rapide ...
Actuelement : Ubuntu 12.04 (Unity)

Hors ligne

#2 Le 15/08/2012, à 00:58

louis94

Re : [PYTHON] Gestion de fichiers universels dans un programme

Salut,

Est-ce que ton projet ne se rapprocherait pas de KIO (Kde) ou de GVFS (Gnome) ? Il y a des ports vers Python pour ces bibliothèques... et elles gèrent Ftp, Http, leurs versions sécurisées, ... même SVN ! Et, comme tu le souhaites, les fichiers archivés. Pourquoi réinventer la roue ?

Kde en Python : http://techbase.kde.org/Development/Languages/Python
Gtk en Python : http://python-gtk-3-tutorial.readthedoc … index.html (Tout programme utilisant GIO utilisera GVFS s'il est installé.)

Louis

Hors ligne

#3 Le 17/08/2012, à 15:05

peyo56

Re : [PYTHON] Gestion de fichiers universels dans un programme

Imaginon cela :
Si GVFS ou KIO permet de faciliter l'ouvrerture une archive rar qui se trouve dans une archive tar compréssé par lzma pour y extirper des fichiers et les placer dans un fichier jar ( pareil qu'un zip sauf l'extension ) cela a partir d'une méthode que l'on pourrait programmer pour cela et pouvant être appellée de la sorte :

copy( ['/home/user', '/.share/test', '/myfile.tar.lzma', '/special.rar', '/included.xml'], ['/home/user', '/.share/test', '/myfile.jar','/'] )

Tout en étant compatible le plus possible avec la majorité des OS et au moins les principaux : Windows ( au moins de XP a 7 ), mac, linux ( famille debian pour l'instant ). Dans ce cas la je suis preneur.

J'aimerait bien travailler sur un support réseau aussi par la suite, mais ce sera plus tard.

L'idée étant - je le précise - de faire des actions automatiques avec un acces "universel" au travers de conteneurs différents avec python. Des actions tel que la copie, la supression, le listage,

Je fait ca pour un programme qui permetrait d'installer du contenu pour le jeu minecraft.
J'ai principalement besoin de faire cela car instaurer un standard de "paquets" dans un monde où tout le monde utilise des outils biens diferents, où il y en aura qui font des zip, rar, 7z ... qui hebergent par http, ftp svn ... ou il y en as qui placent des archives dans des archives ... et ou les utilisateurs de ces contenus sont bien incapables de les installer, car en effet, c'est toujours different, il y a toujours des problemes de dependances ou d'incompatibilité. Je pense qu'on ne doit pas trop unifier les choses, car certaines choses ne peuvent etre faites si c'est trop "droit", je prefere plutot adapter mon outil au contenu.


Installation simple : Windows Vista 1h48 - Ubuntu Maverick 0h27
Instalation complete: Windows Vista ... - Ubuntu Maverick 2h
Comme quoi, Il y en a qui choisissent trop vite mais pas pour le plus rapide ...
Actuelement : Ubuntu 12.04 (Unity)

Hors ligne

#4 Le 17/08/2012, à 23:36

louis94

Re : [PYTHON] Gestion de fichiers universels dans un programme

Bonjour,

Je crois que KIO est limité à 1 niveau de "récursion" (on va appeler comme ça le fait de pouvoir ouvrir une archive dans une autre archive). C'est qu'en observant Dolphin que je dis ça, je ne sais pas ce qu'on peut effectivement mettre dans les QUrls qu'on passe à KIO.
KDE fonctionne sous Linux (si!), il existe une version Windows (XP et +) et une version Mac, mais elles ont un peu de retard. Pour le port vers Python... je ne crois pas qu'il y ait des versions compilées, mais le code devrait être fonctionnel partout, ça reste Qt à la base...

GVFS devrait être plus facile à trouver sur Win et Mac, mais il me paraît plus difficile de savoir quels formats sont supportés. Il y a un greffon laconiquement nommé « gvfsd-archive »...

Je ne vois pas trop ce que ta fonction copy(...) copie. Le fichier /home/user/.share/test/myfile.tar.lzma/special.rar/included.xml dans /home/user/.share/test/myfile.jar ?

Ah oui : ajouter Kde ou Gtk comme dépendance simplement pour ouvrir des archives, c'est un peu con. Autant l'utiliser pour l'interface utilisateur aussi (et pourquoi pas en C++, tant qu'on y est ?).

Adapter son outil, c'est bien, mais on peut très bien le faire de manière limitée au début (les archives imbriquées, c'est si courant que ça ?) tout en ayant la suite en tête quand on construit l'architecture du programme. Enfin c'est ce que je pense smile

Louis

PS : Pour rar, 7z et d'autres, il faut de toute façon installer le programme correspondant.

Hors ligne

#5 Le 18/08/2012, à 01:51

peyo56

Re : [PYTHON] Gestion de fichiers universels dans un programme

Merci de ta reponse

premierement pour ce qui est de KIO ou GVFS, mon choix se porte plus sur la famille gnome, je trouve qu'utiliser gtk+ pour les interfaces est pas mal.

L'utilisation de python a déjà été réfléchi depuis longtemps :
- une compatibilité avec la majorité des systèmes pour un même exécutable.
- utilisation d'un language ouvert et facile a comprendre
- peu d'installation a partir d'un systême neuf, voir possibilité d'embarquer l'ensemble interpreteur + programme + bibliotheques sur une clef usb
- possibilité de modifier rapidement le code, d'y mettre un systeme de greffons
- l'acces a des bibliotheques diverses et variées

Pour moi c'est le meileur choix, je peut bien me tromper

Pour etre tres precis, mon programme suporte en theorie une infinité de niveau de récursion, en pratique c'est python ou le systeme qui limitera surement a cause d'une trop grande utilisation de la memoire ( tout les fichiers sont ouverts en tant que fichier temporaires, et sont enregistrés avec une procedure d'ecriture vers le conteneur en question ), son but n'est absolument pas l'affichage d'images ou d'ecoute de musiques, mais uniquement des actions de copie, supression, lecture et j'en passe ...

D'ici peu je posterait un lien vers le git en question


Installation simple : Windows Vista 1h48 - Ubuntu Maverick 0h27
Instalation complete: Windows Vista ... - Ubuntu Maverick 2h
Comme quoi, Il y en a qui choisissent trop vite mais pas pour le plus rapide ...
Actuelement : Ubuntu 12.04 (Unity)

Hors ligne