Forum EduPython

Echanges autour d'EduPython.

Vous n'êtes pas identifié(e).

#1 2019-06-10 19:59:44

Pacotille
Membre
Inscription : 2017-12-31
Messages : 7

Chemin relatif / absolu du module lors de l'exécution d'une fonction

Bonjour, j'ai créé un programme dont le but est de créer un dictionnaire contenant le nom de mes élèves comme clés, et leurs moyennes de classe comme valeurs.
Le programme se base sur le csv téléchargeable via pronote dans la saisie des notes.
Voici le programme :

import io
from random import *
import matplotlib.pyplot as plt

ListDesEleves = []

#Ouverture du fichier "2D3T3.csv" en mode lecture. io : pour gérer l'encoding utf8 sans quoi les accents sont foireux
with io.open("2D3T3.csv", 'r', encoding='utf8') as fichier:
#Contenu du fichier 2D3T3.csv :
    contenu=fichier.readlines()
#Suppression de la première et de la dernière ligne du ficchier
contenu.pop(0)
contenu.pop(-1)

#Creation des objets élèves pour chaque couple (élève,moyenne) du fichier et ajout à la ListDesEleves
L=[]
K=[]
for ligne in contenu :
    k=0
    nom=""
    moyenne=""
    #Pour chaque caractère de la ligne courante, si on a compté aucun ';' (k==0), on ajoute le caractère  au nom (sauf si le caractère est un ").
    #Pour chaque caracère après avoir compté un ';' (k==1), on ajoute le caractère à la moyenne
    #On arrète de lire la ligne si on compte deux ';' (k==2)
    for char in ligne :
        if char!=";" and char!='"' and k==0:
            nom+=char
        elif char!=";" and k==1:
            moyenne+=char
        elif char==";":
            k=k+1
        elif k==2:
            break
    L.append(nom)
    K.append(moyenne)
    eleve=Eleve(nom,moyenne)
    ListDesEleves.append(eleve)

#fermeture du fichier
fichier.close

#Remplace les moyennes enregistrées en tant que chaîne de caractères par des flottants.
for i in range(len(K)):
    K[i]=K[i].replace(",",".")
    K[i]=float(K[i])
#affichage des élèves contenus dans la ListDesEleves :
##for eleve in ListDesEleves :
##    print(eleve.nom," à une moyenne de ",eleve.moyenne,"/20")

#################################################################
#Crée le dictionnaire représentant les élèves de la classe et leurs notes
Classe={}
for i in range(len(K)):
    Classe[L[i]]=K[i]

Le code marche très bien dès l'instant où le module est enregistré dans le même répertoire que le fichier CSV.

En revanche, les choses se gâtent dès lors que je fais un copier-coller de ce code, et que je intègre dans une fonction (qui a pour argument le nom du fichier csv, et qui retourne en sortie le dictionnaire contenant les élèves).
En effet, la ligne 7 du code qui suit échoue, car le fichier est introuvable. En cherchant à trouver le chemin courant où se trouve le module lors de l'exécution de la fonction, il me répond qu'il est dans C:/Edupython.
Alors qu'à l'exécution du code présenté ci-dessous, le chemin courant est C:/Users/Documents/2018-2019/Python/main.py

def recup(nom_fichier):
    """nom_fichier est le nom du fichier csv téléchargé avec les notes des élèves via pronote, en chaine de caractère.
    recup renvoie alors deux listes, l'une avec les noms des élèves, et l'autre avec leurs notes
    /!\ S'il y a un élève qui n'a pas de notes, le supprimer de la liste ou ajouter une note fictive /!\ """

    #Ouverture du fichier "nom_fichier.csv" en mode lecture
    with io.open(nom_fichier+".csv", 'r', encoding='utf8') as fichier:
    #Contenu du fichier nom_fichier.csv :
        contenu=fichier.readlines()
    #Suppression de la première et de la dernière ligne du fichier
    contenu.pop(0)
    contenu.pop(-1)

    #Creation des objets élèves pour chaque couple (élève,moyenne) du fichier et ajout à la ListDesEleves
    L=[]
    K=[]
    for ligne in contenu :
        k=0
        nom=""
        moyenne=""
        #Pour chaque caractère de la ligne courante, si on a compté aucun ';' (k==0), on ajoute le caractère  au nom (sauf si le caractère est un ").
        #Pour chaque caracère après avoir compté un ';' (k==1), on ajoute le caractère à la moyenne
        #On arrète de lire la ligne si on compte deux ';' (k==2)
        for char in ligne :
            if char!=";" and char!='"' and k==0:
                nom+=char
            elif char!=";" and k==1:
                moyenne+=char
            elif char==";":
                k=k+1
            elif k==2:
                break
        L.append(nom)
        K.append(moyenne)

    #fermeture du fichier
    fichier.close

    for i in range(len(K)):
        K[i]=K[i].replace(",",".")
        K[i]=float(K[i])
    #affichage des élèves contenus dans la ListDesEleves :
    ##for eleve in ListDesEleves :
    ##    print(eleve.nom," à une moyenne de ",eleve.moyenne,"/20")
    return L,K
#################################################################
def dico(L,K):
    """Créer un dictionnaire avec les clés contenant L ayant pour valeurs les éléments de K"""
    Classe={}
    for i in range(len(K)):
        Classe[L[i]]=K[i]
    return Classe

Ceci renvoie :
>>> recup("2D3T3")
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Documents\2018-2019\Python\CSV\groupe_eleve.py", line 11, in recup
    with io.open(nom_fichier+".csv", 'r', encoding='utf8') as fichier:
FileNotFoundError: [Errno 2] No such file or directory: '2D3T3.csv'

Et le plus étonnant, c'est qu'en faisant un print de chacune des premières instructions, et en recopiant les données affichées dans le print dans la console pour les exécuter dans la console, on arrive bien à trouver le fichier.
Il semblerait (un ami a essayé de comprendre pourquoi il y avait un tel problème) que le répertoire courant à l'exécution de la fonction est C:/Edupython, et n'a trouvé comme moyen de corriger le problème que de mettre le chemin absolu dans la commande with io.open (et encore, impossible de concaténer le chemin absolu jusqu'au dossier avec le nom du fichier).


En attendant, je change le code à chaque fois dans la fonction, en conservant le chemin absolu. Mais je suis curieux de comprendred'où vient le problème que je rencontre. Si quelqu'un a déjà rencontré ce problème, je suis toute ouïe.

Bonne soirée

Dernière modification par Pacotille (2019-06-10 20:01:49)

Hors ligne

#2 2019-06-10 20:08:08

Pacotille
Membre
Inscription : 2017-12-31
Messages : 7

Re : Chemin relatif / absolu du module lors de l'exécution d'une fonction

PS : Pour préciser le code : il y a dans le code aux lignes 36-37 des objets définis dans un autre programme (objet élève) mais qui n'ont pas d'utilité dans le programme présenté ici qui n'utilise que les listes K et L.

Hors ligne

#3 2019-06-10 20:33:47

Pacotille
Membre
Inscription : 2017-12-31
Messages : 7

Re : Chemin relatif / absolu du module lors de l'exécution d'une fonction

Problème résolu, il semblerait que le logiciel n'ait pas aimé que j'appelle un de mes dossiers CSV

Hors ligne

#4 2022-04-04 16:41:58

vandymath
Membre
Inscription : 2018-03-09
Messages : 3

Re : Chemin relatif / absolu du module lors de l'exécution d'une fonction

Bonjour à tous, j'ai le même problème mais sans solution avec le code suivant:

import csv
def extraction(nom_fichier):
    # On commence par ouvrir le fichier
    fichier=open(nom_fichier,encoding="utf-8")
    base1=list(csv.reader(fichier))     # on transforme le contenu du fichier en liste
    fichier.close()                     # On referme le fichier

    Base_extraite=[]
    for i in range (1,len(base1)):      # on commence à 1 puisque la première ligne correspond aux descripteurs
        dico={}                         # On va définir autant de dictionnaires que d'entrée dans la table
        for j in range (len(base1[0])): # Cela va permettre de parcourir tous les descripteurs
            descripteur = base1[0][j]   # On définit le nom du descripteur
            valeur=base1[i][j]          # On définit la valeur associée au descripteur
            dico[descripteur]=valeur # pour chaque dictionnaire, le descripteur se voit affecter sa valeur
        Base_extraite.append(dico)

    return Base_extraite

J'ai testé en me mettant dans un dossier D:\test_python et ça ne fonctionne pas

À noter que lorsque je lance le fichier avec Thonny, cela fonctionne sans soucis.

Si quelqu'un a des idées, je suis preneur.

Merci

Hors ligne

#5 2022-05-04 09:27:53

davidC
Membre
Inscription : 2022-05-04
Messages : 1

Re : Chemin relatif / absolu du module lors de l'exécution d'une fonction

Bonjour,

Je rencontre la même difficulté  que Vandymath  (post du 4 avril 2022 à 16h41) . Dans la cadre du chapitre "Photographie numérique" en  SNT seconde, je demande aux élèves de modifier une image ( inversion horizontal/vertical, gauche/droite, assombrissement ).
3 fonctions sont définies dans un script. Le script python et l'image "pontscouverts.jpg" sont placées dans le même répertoire donc il ne devrait pas y avoir de problème mais lorsque j'appelle la fonction depuis la console j'obtiens le message
FileNotFoundError :[Errno 2] No such file or directory :’pontscouverts.jpg”

Le code est :

from PIL import Image

def action_symetrie_gauchedroite(nom):
    """Effectue la symérie gauche-droite"""
    source = Image.open(nom).convert('RGB')
    largeur = source.width
    hauteur = source.height
    dest  = Image.new('RGB', (largeur, hauteur))

    for x in range(largeur):
        for y in range(hauteur):
            rouge, vert, bleu = source.getpixel((x, y))
            dest.putpixel(
                    (largeur -x -1,y), # On inverse la position des pixels de gauche et droite
                    (rouge,vert,bleu), # On garde la même couleur que le Pixel de référence
                    )

    dest.save("gauchedroite.png")
    return dest

A noter : cela fonctionne sans problème sur Python 3.8.10  (  https://www.python.org).

Quelqu'un a t il une idée de ce qui se passe ? Cela semble vraiment spécifique à EduPython  car cela fonctionne sur d'autres environnements.

Merci

Dernière modification par davidC (2022-05-04 09:28:25)

Hors ligne

Pied de page des forums