Python lire un fichier erreur "d'emplacement?"

Résolu
Prince-des-Lillas-III -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

Je n'arrive pas à lire mon fichier texte.

langue = input("Quelle matière voulez vous travaillez ?  ")
if (langue == "Anglais") or (langue == "anglais"):
    f = open("Anglais.txt" , "r")
    liste = f.readlines()
    print(liste)

    f.close()
else:
    print('La matière que vous avez renseigné n\'est pas valide, \nliste des matière valide : \n"Anglais" (ou "anglais")')

input("")

Message de la console :
 

*** Console de processus distant Réinitialisée *** 
Quelle matière voulez vous travaillez ?  Anglais
Traceback (most recent call last):
  File "P:\gcleret\bureau\python\aprantisage.py", line 5, in <module>
    f = open("Anglais.txt" , "r")
FileNotFoundError: [Errno 2] No such file or directory: 'Anglais.txt'
>>>

(*Le dossier se trouve sur le bureau*)

Pouvez-vous m'aider, s'il vous plaît ?

Windows / Chrome 113.0.0.0

4 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    as-tu essayé d'indiquer, dans le programme, le chemin complet vers le fichier?

    1
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     

    Bonjour,

    Puisque le chemin vers Anglais.txt est relatif, tout dépend d'où est lancé le programme python. Vu que ton script python et ce fichier Anglais.txt sont dans le même dossier, il faut que le répertoire depuis lequel le script est exécuté soit celui dans lequel il se trouve.

    Sinon, comme l'indique yg_be #1, il faut passer un chemin absolu.

    Épilogue

    Pour lire un fichier proprement (et notamment, ne pas oublier de le fermer)

    • on utilise plutôt le context manager with comme indiqué ci-dessous
    • on utilise plutôt la classe Path fournie par pathlib (classe standard en python 3) pour stocker un chemin
    • comme tu es sous windows, pour éviter d'échapper les \, on utilise des r-strings (par exemple r"c:\dossier\sous-dossier\fichier" au lieu de "c:\\dossier\\sous-dossier\\fichier")
    • comme on veut injecter des valeurs de variables dans nos chaînes on utilise des f-strings (les parties entre accolades sont alors évaluées comme du code python)

    En appliquant toutes ces remarques, on obtient :

    import sys
    from pathlib import Path
    
    langue = input("Langue ?")
    path = Path(rf"P:\gcleret\bureau\python\{langue}.txt")
    if path.exists():
        with open(path, "r") as f:
            lines = f.readlines()
        print(lines)
    else:
        print(f"Fichier {filename} invalide", file=sys.stderr)
    
    input()

    Bonne chance

    1
  3. jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention   9 984
     

    Bonjour,

    Etant donné que le source n'a pas d'extension .py, on peut supposer que tu n'affiches pas les extensions connues.

    Cela voudrait dire que ton fichier s'appelle Anglais.txt.txt ; supprime l'une des extensions.


    0
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour,

    Hé oui, c'est une erreur classique. Tu n'as plus qu'à renommer ton fichier Python en "apprentissage".

    Et corriger le message : "Quelle matière voulez vous travailler ?" et ce sera au top

    Tu pourrais aussi éviter le problème minuscule/majuscules:

    langue = input("Quelle matière voulez vous travailler ?  ").lower()
    f = open(langue + '.txt' , 'r')

    Le fichier doit alors être écrit tout en minuscule (anglais.txt).

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Sous Windows, les noms de fichiers ne sont pas sensibles à la casse.

      0
      1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Oui, c'est vrai

        Donc ma remarque ne vaut que pour remplacer

        if (langue == "Anglais") or (langue == "anglais"):

        par une mise en minuscules de la saisie par input, puis le test sur

        une chaine en minuscules

        0