IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Probleme: chargement d'un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut Probleme: chargement d'un fichier
    Bonjour,
    J'ai commencé un programme qui permettra, en gros, d'avoir une synthèse de tous ses cours sur le pc. Mais bon, voilà le problème:
    La liste des cours, les cours, les chapitres, sous-chapitres, notes,... sont stockés dans des fichiers sans extensions (un fichier par cours qui contient pour chaque la liste de ses chapitres, chaque chapitres possèdent deux fichiers, un pour tout ce qui est notes, exercices,... et l'autre contient la liste de ses sous-chapitre (qui eux-mêmes ont 2 fichiers,...)). Mais j'aimerais que l'affichage des cours soient "dynamiques", par exemple, lorsque j'ajoute un cour, un fichier est créé et le nom du cour est inscrit dans la liste des cours, j'ai créé une fonction pour afficher les différent cours et donc je lance cette fonction à la fin de celle qui ajoute le cour, mais le cour ne s'affiche que tous les deux ajout. Enfin, bref, vous comprendrez peut-être mieux avec le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    # -*- coding: cp1252 -*-
    from Tkinter import *
    import os
     
    verif=0
     
    try: #Crée le fichier de la liste de cour si il n'existe pas
        list_cours=open("Cours/Liste_cours","r")
        cours=list_cours.read().split("/220695/")
        cours.remove("")
        list_cours.close()
    except:
        path=os.getcwd()
        os.mkdir(path+"\\Cours")
        list_cours=open("Cours/Liste_cours","w")
        cours=[]
        list_cours.close()
     
    liste=["H","h","E","e","A","a","O","o","U","u","I","i","Y","y"] #Pour la 75e ligne
     
    def charg_c(): #Fonction pour afficher les cours
        global var
        list_cours=open("Cours/Liste_cours","r")
        cours=list_cours.read().split("/220695/") #Sépare les différents noms de cours
        cours.remove("")
        list_cours.close()
        if len(cours)==0:
            global lab, fen, verif
            verif=1
            lab=Label(fen, text="Désolé, vous n'avez pas\nencore ajouté de cours")
            lab.grid(row=6,column=5,rowspan=1)
        else:
            if verif==1:
                lab.destroy()
                del lab
            global cour, ajout_chap
            cours_bus=[]
            for i in range(0,len(cours)):            
                cour=Menubutton(fen,text=cours[i],relief="raised")
                cour.m=Menu(cour,tearoff=0)
                c_d=open("Cours/"+cours[i],"r")
                data=c_d.read().split("/220695/")
                data.remove("")
                c_d.close()
                for d in data:
                    cour.m.add_command(label=d,command= lambda chap=d: ouvrir_chap(chap))
                cour.m.add_command(label="Ajouter un chapitre", command= lambda c=cours[i]: ajout_chap(c))
                cour.config(menu=cour.m)
                cour.grid(row=6+i, column=5)
                cours_bus.append(cour)
        print "actualiser", cours #Pour vous prouvez que le fichier ne s'actualise pas
     
     
    def ajout_chap(cour): #Fonction pour ajouter un cour/chapitre
        def ajouter(EVENT=None):
            ph1=enAj.get()
            list_chap=open("Cours/"+cour,"a")
            list_chap.write(str(enAj.get())+"/220695/")
            list_chap.close
            new_chap=open("Cours/"+str(enAj.get()),"w")
            new_chap.close()
            if cour!="Liste_cours":
                new_chapNote=open("Cours/"+str(enAj.get())+"_notes","w")
                new_chapNote.close()
            fenAj.destroy()
            charg_c()
            fenOk=Toplevel()
            if cour=="Liste_cours":
                if ph1[0] in liste:
                    ph2="Le cour d'"
                else:
                    ph2="Le cour de "
            else:
                ph2='Le chapitre "'
            ph=ph2+ph1+'" a bien été ajouté'
            labOk=Label(fenOk, text=ph)
            labOk.grid(row=1,column=1,columnspan=3)
            buOk=Button(fenOk, text="Ok", command=fenOk.destroy)
            buOk.grid(row=2,column=2)
        fenAj=Toplevel()
        if cour=="Liste_cours":
            ph4="cour"
        else:
            ph4="chapitre"
        fenAj.title("Ajout d'un "+ph4)
        attAj=Label(fenAj, text="""ATTENTION, n'utilisez pas de caractères spéciaux (ç,à,é,...),
    au risque de dérégler complètement le programme""")
        attAj.configure(fg="yellow", bg="red")
        attAj.grid(row=1,column=1,columnspan=5)
        labAj=Label(fenAj, text="Titre :")
        labAj.grid(row=2,column=1,columnspan=3)
        enAj=Entry(fenAj)
        enAj.bind("<Return>", ajouter)
        enAj.grid(row=2,column=4,columnspan=3)
        valAj=Button(fenAj, text="Ajouter", command=ajouter)
        valAj.grid(row=3,column=3)
        annAj=Button(fenAj, text="Annuler", command=fenAj.destroy)
        annAj.grid(row=3,column=4)
     
    def ouvrir_chap(chap): #Cette fonction n'est pas finie
        global list_fen
        try:
            if list_fen==None:
                list_fen=[]
        except:
            list_fen=[]
        topfen=Toplevel()
        topfen.title(chap)
        list_fen.append(topfen) #Continuer de construire l'interface
     
     
    fen=Tk()
     
    lab_cours=Label(fen, text="Liste des cours")
    lab_cours.grid(row=5,column=1,columnspan=10)
     
    if len(cours)!=0:
        cond=len(cours)
    else:
        cond=1
    ajout_cour_bu=Button(fen, text="Ajouter un cours", command= lambda c="Liste_cours": ajout_chap(c))
    ajout_cour_bu.grid(row=6,column=1,rowspan=cond)
     
    charg_c()
     
    quitter=Button(fen, text="Quitter", command=fen.quit)
    quitter.grid(row=100, column=1, columnspan=10)
     
    fen.mainloop()
    Au fait, comme vous l'aurez surement remarqué, le programme est encore en pleine construction, alors soyez indulgent ^^

    Ah, et aussi, si vous connaissez une fonction pour enlever les caractère non acceptés dans les noms de fichiers, ça serait gentil

    Merci et désolé pour les éventuelles fautes d'orthographe

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Citation Envoyé par Maxxixx Voir le message
    La liste des cours, les cours, les chapitres, sous-chapitres, notes,... sont stockés dans des fichiers sans extensions
    Ca serait certainement plus facile (ordonne et perfomant) de se servir d une base de donnee python-sqlite3 (un fichier unique sauvegarde toutes les infos. ) Bien entendu, cette Bd pourrait ne contenir que les informations "legeres" entre autre:
    - titre des cours
    - titre des chapitres
    - lien vers le fichier (sous bd contenant les autres infos)
    -- contenu du cours
    -- contenu des chapitres
    -- excercices
    -- notices
    -- ...

    Citation Envoyé par Maxxixx Voir le message
    Mais j'aimerais que l'affichage des cours soient "dynamiques", par exemple, lorsque j'ajoute un cour, un fichier est créé et le nom du cour est inscrit dans la liste des cours, j'ai créé une fonction pour afficher les différent cours et donc je lance cette fonction à la fin de celle qui ajoute le cour, mais le cour ne s'affiche que tous les deux ajout.
    Votre mode d affichage des cours est un peu touffu. Vous devriez opter pour des listes: une liste pour selectionner le cours, et une liste pour selectionner le chapitre. La seconde est mise a jour en fonction de l element selectionne dans la première.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    Je pense que vous n'avez pas bien compris la façon dont je veux enregistrer les infos (mais j'ai surement aussi mal expliqué ). j'ai choisi de ne pas mettre tous dans un seul fichier car j'aimerais que l'utilisateur puisse ajouté des sous-chapitres à l'infini (Cour/chapitre/sous-chapitre/sous-sous-chapitre/etc...) vous comprenez? Et aussi car je ne connais pas beaucoup d'autres méthodes pour enregistrer des infos à long terme
    sinon merci pour le conseil d'interface en liste
    J'essaye ça demain car je n'ai plus le temps aujourd'hui

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonsoir,

    Pour votre problème, avons-nous besoin de l'interface graphique?

    Pouvez-vous situer la partie du code qui vous pose problème et seulement ce problème?

    Peut-être ce code sera utile à votre problème (j'avoue ne pas avoir tout compris)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ligne = " "
    with open("Cours/Liste_cours","r") as f:
        while ligne != "":
            cours = input("Entrez le nom du cours :")
            f.write(cours+"\n")
    Pourquoi attaquer directement sur une interface graphique si vous ne maîtrisez pas suffisamment les bases en python?

    Enfin bref ça mérite d'être plus précis et concis.

  5. #5
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Citation Envoyé par Maxxixx Voir le message
    j'ai choisi de ne pas mettre tous dans un seul fichier car j'aimerais que l'utilisateur puisse ajouté des sous-chapitres à l'infini (Cour/chapitre/sous-chapitre/sous-sous-chapitre/etc...)
    Je pense que les Bases de donnees sont la representation informatique de l'infini
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Si j'ai bien compris, chaque "partie" possede:
    • un fichier indexant les sous-parties
    • un fichier propre à la partie


    (je n'ai pas lu ton code, la flemme)

    proposition 1:
    pour une partie nommée foo (par exemple):
    • créer un fichier 'foo' de contenu propre à la partie
    • créer un dossier 'foo_subparts'


    Ainsi la structure des partie est la même que ce soit des chapitres, sous-chapitre, etc... et l'on pourrait exploiter une fonction récursive. Le module os permettant de parcourir un dossier (os.listdir()), de vérifier si un élément est un dossier ou fichier (os.path.isfile()/os.path.isfolder()), il est alors très facile d'obtenir tous les fichiers contenu dans un dossier et ses sous-dossiers

    exemple de fonction récursive pour obtenir tous les chemins de fichiers d'un dossier et de ses sous-dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import os
     
    def get_all_files(path):
        for entry in os.listdir(path):
            entry_path = os.path.join(path,entry)
            if os.path.isfile(entry_path):
                yield entry_path
            elif os.path.isfolder(entry_path):
                for entry_path in get_all_files(entry_path):
                    yield entry_path
    proposition 2:

    Gardes ta structure de fichier/fichier index, mais donne leur une racine de nom commun. Par exemple admettons un chapitre 'foo' qui possède un sous-chapitre 'subfoo', le dossier et le contenu des fichiers s'organiseraient de la sorte (contenu des fichier 'xxx_content' non affiché) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foo_index
        #contenu du fichier
        sub-foo
    foo_content
    sub-foo_index
        # contenu du fichier vide à cause de notre exemple
    sub-foo_content
    Ici encore, un fonction récursive est de mise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import os
     
    def get_all_files(base_name):
        if os.path.exists(base_name + '_content'):
            yield base_name + '_content'
        if os.path.exists(base_name + '_index'):
            with open(base_name +'_index','r') as f_in:
                for line in f_in:
                    if not line.strip():
                        continue
                    for file_path in get_all_files(line.strip()):
                        yield file_path
    bien évidemment, il faudra les adapter à ce que tu cherches à réaliser, ainsi au lieu de de retourner des noms de fichiers, tu voudras peut-être leur faire retourner les données des fichiers de contenu... c'est à toi de voir

    PS : code et message écrits à l'arrache

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    @afranck64

    En fait tu as bien compris le principe et le fait de tout sauvegarder dans un seul fichier semble intéressant mais je préfère utiliser des outils dont j'ai l'habitude (c-à-d les fichiers) mais merci quand même . Je penserais à python-sqlite3 lorsque mon programme fonctionnera pleinement

    @fred1599

    Tout d'abord je tiens à te dire que je trouve que je maitrise assez bien les bases de python pour m'attaquer à une interface (bien que je n'aie que 16 ans, que je vis à la campagne et que je n'ai que 2 heures de programmation par semaine). De plus, tu dis que je ne maitrise pas assez python? Mais je m'y connais assez pour te dire que votre code ne marchera pas car tu as mis un simple "input" au lieu d'un "raw_input" (franchement, qui est-ce qui pense à toujours mettre des "" autour de ses phrases?, à part les programmeurs bien sur ^^ et encore...)
    Maintenant que je me suis expliqué, je vais te ré-expliqué le programme.
    Tout d'abord les contenus des fichiers (ex: les titres) sont séparés par un /220695/ (pour être sûr que personne ne mettrais ce "mot" dans un titre ou des notes).
    Ensuite, si tu veux une représentation "textuelle" voici à quoi ça devrai ressembler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Dans la console:
     
    Liste des cours
    1. Math
    1.1. Trigono
    1.2. Fonctions
    1.3. Ajouter un chapitre à "Math"
     
    2. Français
    2.1. Argumentation
    2.2. Victor Hugo
    2.3. Ajouter un chapitre à "Français"
     
    3. Ajouter un cour
    -------------------------
    Entrez le numéro du cour/chapitre que vous souhaitez ouvrir
    ou de ce que voulez faire: __
    Je ne te met pas les fonctions qui permettraient d'avoir un tel résultat (tu es assez intelligent pour les trouver) mais il devrait surement en avoir 2 principales, une pour explorer les fichiers et les feraient apparaître à l'écran ou alors conserverait la liste des cours et leurs subdivisions dans une variable pour remettre tout dans un ordre plus présentable. L'autre, pour ajouter un cour ou un chapitre. Ces 2 fonction seraient surement de la même logique que celles de mon programme avec les interactions graphiques en moins. J'espère que tu as compris mon programme maintenant.

    @N.tox

    Tu as apparemment bien compris la logique dans laquelle je travaille et c'est très gentil à toi de me proposer deux façon de parcourir les fichiers. Mais j'y avais déjà pensé et donc, ta contribution est un peu inutile . En passant, je crois que la méthode à laquelle j'avais réfléchi ressemble fortement à ta 2e proposition (bien que je ne comprenne pas grand chose à ton code (je ne maîtrise pas très bien le "yield"^^))

    @Tous


    Merci beaucoup de votre contribution, grâce à vous j'ai découvert des nouveaux moyens d'afficher les informations et de meilleures façons pour les trier Mais vous n'avez pas répondu à mon problème principal ^^' Je voulais surtout savoir pourquoi les fichiers ne "s'actualisent" que toutes les deux modification dans le dossier qui contient les cours.
    Voici un petit exemple pour mieux vous le représenter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Voici les cours que contient la fenetre lors du lancement:
        Math /Chapitres: Trigono, Fonctions
        Francais /Chapitres: Victor Hugo
        Histoire /Chapitres: La révolution française
     
    Ensuite, j''ajoute (par exemple) le cour d''anglais grace au bouton "Ajouter un cour"
    et voici ce que contient maintenant la fenetre:
        Math /Chapitres: Trigono, Fonctions
        Francais /Chapitres: Victor Hugo
        Histoire /Chapitres: La révolution française
     
    Vous remarquez que rien n''a changer. Donc j''ajoute (par exemple) un chapitre au cour de
    Francais que je nomme "Argumentation" grace au bouton "Ajouter un chapitre" et voici se
    qu''affiche la fenetre:
        Math /Chapitres: Trigono, Fonctions
        Francais /Chapitres: Victor Hugo
        Histoire /Chapitres: La révolution française
        Anglais /Chapitre: None
     
    Cette fois, le cour que j''avais ajouté tout l''heure apparait mais le sous-chapitre non.
    Il faudra que je rajoute un cour ou un chapitre pour qu''il apparaisse. Et ceci continuera
    tant que je n''aurais pas fermer et rouvert le programme (cette fois, les données sont toutes là)
    J'espère que vous comprenez mon problème maintenant.
    Merci de votre aide si rapide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme de chargement d'un fichier en centos
    Par monta_amri dans le forum Linux
    Réponses: 2
    Dernier message: 02/04/2015, 16h43
  2. Probleme sur le chargement d'un fichier texte
    Par xanthos dans le forum HyperFileSQL
    Réponses: 0
    Dernier message: 16/03/2011, 13h23
  3. Réponses: 0
    Dernier message: 24/08/2008, 10h56
  4. Probleme pour lire un fichier Ini
    Par Sebinou dans le forum C++Builder
    Réponses: 11
    Dernier message: 10/03/2004, 23h22
  5. [BP7] Problème chargement de ressource dans une DLL
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 26/07/2003, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo