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 :

AttributeError: 'NoneType' object has no attribute 'readlines'


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut AttributeError: 'NoneType' object has no attribute 'readlines'
    Bonjour à tous,

    Je suis débutant en Python, j'essaye de coder un script pour un casseur de mot de passe. Tout se passe bien jusqu'à se que j'incorpore une liste de mots dans mon script , j'obtiens un message d'erreur du type :
    AttributeError: 'NoneType' object has no attribute 'readlines'
    voilà un bout de mon script:

    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
     
    class Exception_as_Error:
        pass
     
     
    def crack_dict(md5, file, ofiles=None):
        try:
            trouve = False
            ofile = open(file, "r")
            for mot in ofiles.readlines():
                mot = mot.strip("\n")
                hashmd5 = hashlib.md5(mot.encode("utf8")).hexdigest()
                if hashmd5 == md5:
                    print("Mot de passe trouvé : " + str(mot) + " (" + hashmd5 + " )")
                    trouve = True
            if not trouve:
                print("Mot de passe non trouvé :(")
                ofile.close()
    J'ai du mal à voir d'où vient le problème, serait-il possible que l'on m'éclaire un peu.

    Cordialement

  2. #2
    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
    Bonjour,

    Le problème est que ofiles peut valoir None, il faut prendre en compte cette possibilité pour éviter le type d'erreur que tu reçois.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par xavcemoi Voir le message
    j'essaye de coder un script pour un casseur de mot de passe.
    Hum... interdit par les règles. Enfin si on considère que c'est pour s'exercer et que de toute façon ce genre de script mettra des milliards d'années pour trouver un résultat ça peut passer...

    Citation Envoyé par xavcemoi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Exception_as_Error:
        pass
    A quoi sert cette instruction?

    Citation Envoyé par xavcemoi Voir le message
    print("Mot de passe trouvé : " + str(mot) + " (" + hashmd5 + " )")
    print("Mot de passe trouvé: %s (%s)" % (mot, hashmd5)).

    Citation Envoyé par xavcemoi Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not trouve:
    	print("Mot de passe non trouvé :(")
    	ofile.close()
    Ah d'accord. Tu ne fermes le fichier que si tu n'as pas trouvé. Oui, moi aussi chez-moi j'ouvre des dictionnaires et je cherche un mot dedans et si le mot n'y est pas je laisse le dictionnaire ouvert sur la table. Total j'ai des milliards de dictionnaires ouverts sur ma table.
    Etre débutant n'est pas une excuse pour ne pas réfléchir à la logique de son code...

    Citation Envoyé par xavcemoi Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    trouve=False
    for mot in ...
    	if mot ...
    		print(...)
    		trouve = True
    if not trouve:
    	print(...)
    Ok, tu ne connais pas le else qui suit une boucle, c'est excusable. Ca permet justement d'éviter ce schéma "je mets un flag et à la fin je teste le flag". Accessoirement quand on a trouvé inutile de tester les autres mots (et c'est ce qui permet au else de fonctionner).

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for mot in ...
    	if mot ...
    		print(...)
    		break
    else:
    	print(...)
    Si on est sorti de la boucle par break (parce qu'on a trouvé) alors le "else" n'est pas pris en compte. Sinon (parce qu'on n'a pas trouvé) alors il l'est.

    Et puis éviter les noms de variables identiques à une lettre près (ofile/ofiles) c'est pas top question lisibilité/compréhension. Te devrais quand-même être capable de plus d'originalité et surtout trouver des noms de variables en rapport avec leur rôle...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 739
    Par défaut
    Salut,

    Citation Envoyé par xavcemoi Voir le message
    J'ai du mal à voir d'où vient le problème, serait-il possible que l'on m'éclaire un peu.
    Normalement Python vous donne la ligne et l'instruction qui pèche... mais comme il n'y a qu'un appel a .readlines dans le code que vous montrez, on peut supposer qu'il s'agit de la ligne 10: for mot in ofiles.readlines():

    Ce qui suggère que la variable ofiles est à None (ce qui est la valeur par défaut donnée par les paramètres de la fonction) ou que vous avez ajouté un "s" à la variable associé au fichier ouvert à la ligne précédente (et on évite de s'endormir sur son clavier).

    Pour le reste, vous avez des tutos qui proposent des exercices corrigés pour vous entraîner à voir comment Python réagit.
    C'est là qu'on se familiarise avec les messages d'erreurs et la relecture attentive du code qu'on a écrit: si on n'apprend pas à le faire sur ces exercices "simples", on est vite perdu lors qu'on part à coder sans avoir acquis ces réflexes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour,

    Il faudrait voir dans un premier temps si la variable ofiles existe après un ofile = open(file, "r")EDIT: grillé

    --

    je suppose que le fichier est volumineux ... donc il faut lire ligne par ligne et non tout fourrer dans une variable en ram

    je suppose que tu as 100 milions de lignes (sinon aucun intérêt), il faut donc gagner la moindre nano-seconde

    pour le fichier.close(), puisque tu utilises des "try:", tu peux éventuellement le mettre dans un "finally" ou, utiliser un "with open()"

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 739
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Il faudrait voir dans un premier temps si la variable ofiles existe après un ofile = open(file, "r")
    C'est tout vu puisque tous les paramètres de la fonction seront variables locales...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Bonjour à tous,

    Merci pour vos retours, j'ai réussi en incorporant vos remarques, je n'avais pas déclaré la variable.

    Il s'agit d'un petit casseur de mot de passe puisqu'il n'a à trouver que des md5 et des mots ne comportant que 5 lettres c'est juste pur le fun, il n'y a rien de malveillant derrière.

    Merci,

    Cordialement

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xavcemoi Voir le message
    je n'avais pas déclaré la variable.
    En Python on ne déclare pas de variables, on les crée en leur donnant une valeur. Montre ton nouveau code et on te dira s'il y a des trucs à améliorer.

    Citation Envoyé par xavcemoi Voir le message
    c'est juste pur le fun, il n'y a rien de malveillant derrière.
    Oui on s'en doute. Surtout en Python (ce n'est pas le plus adapté pour ce travail, question rapidité il est à la ramasse face à la foultitude de ceux qu'on trouve sur le net)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Bonjour à tous,

    Voilà mon 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
     
    #!usr/bin/env python3
    # coding:utf-8
    import argparse
    import atexit
    import hashlib
    import string
    import sys
    import time
    from typing import Any
     
     
    class Exception_as_err:
        pass
     
     
    def crack_dict(md5: object) -> object:
        """
     
        :param md5:
        """
        try:
            open("home/kali/Desktop/liste_francais.txt", "r")
            for mot in mot_fr.readlines():
                trouve = False
                mot_fr = Any
                mot = mot.rstrip("\n")
                hashmd5 = hashlib.md5(mot.encode("utf8")).hexdigest()
                if hashmd5 == md5:
                    print("Mot de passe trouvé : " + str(lettres) + " (" + hashmd5 + " )")
                trouve = True
                break
            if not trouve:
                print("Mot de passe non trouvé :(")
        except FileNotFoundError:
            print("Erreur ; Nom de dossier ou fichier introuvable !")
            sys.exit(1)
        except Exception_as_err:
            print("Erreur ; " + str('err'))
            sys.exit(2)
     
     
    def crack_incr(md5: object, haslib: object = None,
                   currpass=None, length=None):
        if currpass is None:
            currpass = []
        lettres: str = string.ascii_letters
        if currpass is None:
            currpass = []
        if length >= 1:
            if len(currpass) == 0:
                for c in lettres:
                    currpass[length - 1] = c
                    print("Trying : " + "".join(currpass))
                    if haslib.md5("".join(currpass).encode("utf8")).hexdigest() == md5:
                        print("PASSWORD FOUND! " + "".join('currpass'))
                    else:
                        crack_incr(md5, currpass)
            else:
                return
     
     
    def display_time():
        print("Durée : " + str(time.time() - debut) + " secondes")
     
     
    parser = argparse.ArgumentParser(description="Password Cracker")
    parser.add_argument("-f", "--list", dest="file", help="Path of the dictionary file", required=False)
    parser.add_argument("-g", "--gen", dest="gen", help="Generate MD5 hash of password", required=False)
    parser.add_argument("-md5", dest="md5", help="Hashed password", required=False)
    parser.add_argument("-l", dest="plength", help="Password length", required=False, type=int)
     
    args = parser.parse_args()
     
    debut = time.time()
     
    atexit.register(display_time)
     
    if args.md5:
        print("[CRACKING HASH " + args.md5 + "]")
        if args.file and not args.plength:
            print("[USING DICTIONARY FILE " + args.file + "]")
            crack_dict(args.md5)
        elif args.plength and not args.file:
            print("[USING INCREMENTAL MODE FOR " + str(args.plength) + " letter(s)")
            crack_incr(args.md5, args.plength)
        else:
            print("Please choose either f or l arguments")
    else:
        print("MD5 HASH NOT PROVIDED")
     
    if args.gen:
        print("[MD5 HASH OF " + args.gen + " : " +
              hashlib.md5(args.gen.encode("utf8")).hexdigest())

    Il est sûrement pas parfait mais il fonctionne,

    @ plus tard

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    re-bonjour
    Il est sûrement pas parfait
    pas de problème, la perfection en code est très très rare

    mais il fonctionne,


    Tu avais dit faire ce code pour exercice, le but n'est pas d'apprendre python ou de s'améliorer en python ? Si on arrète dès que cela fonctionne, on a aucune chance de s'améliorer (mais si c'est ton choix, ok)
    En fait, tu n'a pas tenu compte des diverses remarques !
    Tu nous a bien re-copier un code qui fonctionne ????


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open(fichier)
    mot_fr.readlines():
    que peut-être cette variable mot_fr ?

    ------------
    On te dit de fermer toujours un fichier ouvert ...

    -----------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def crack_dict(md5: object) -> object
    oui, pas faut puisque cette function retourne toujours l'objet None

    ----------
    Toujours utilisation de readlines() ...

    ----------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mot = mot.rstrip("\n")
                hashmd5 = hashlib.md5(mot.encode("utf8")).hexdigest()
                if hashmd5 == md5:
                    print("Mot de passe trouvé : " + str(lettres) + " (" + hashmd5 + " )")
    logique d'afficher lettres à la place de mot ???

    ---------
    tes exit dans ta fonction !!!
    Pourquoi pas, si erreur mais sinon ta fonction doit retourner des datas et c'est à "main" de gérer le résultat (éventuellement quitter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def crack_dict(md5: object):
       ...
       if hashmd5 == md5:
           return (mot, hashmd5)
       ...
       return None,None    # a la dernière ligne de la fonction
     
    mot, md5 = crack_dict(args.md5)
    if mot:
      print("trouvé", mot, md5)
    else:
     print("oops")
     exit(1)
    ---------
    utilisation de "Exception_as_err", déjà dit, mais rien de changé


    ---------
    certainement bien d'autres chose, mais si tu ne désires pas améliorer ton codage, pas d'intéret à te les donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if currpass is None:
            currpass = []
        lettres: str = string.ascii_letters
        if currpass is None:
            currpass = []
    ca pique (doublement * 2), mais ca marche

    --------
    ps: évite le typage !
    Si on type c'est pour avoir un typage strict ... et toi tu passes comme typage des trucs génériques (OUI, tout en python est objet)

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    re-bonjour,

    Je n'ai jamais dit que je n'étais pas ouvert à l'amélioration de ce code...

    Je me suis inscrit à un cours en ligne pour apprendre les bases et connaître un peu plus, ne plus faire les erreurs que j'ai faites.

    Cordialement,

    @ plus tard

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par xavcemoi Voir le message
    ne plus faire les erreurs
    Nous en faisons tous, simplement un débutant en fait pas mal. Donc ton code est justement une bonne base car très perfectible.

    Simplement, ici, on ne voit aucun changement suite aux remarques sur le premier jet (voir même les choses ont empirées) Soit, tu n'en tiens pas compte, et on ne peut t'aider. Soit tu n'as pas compris les remarques ... alors il faut demander pour avancer

  13. #13
    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
    Hello,

    Le code "fonctionnel" a été créé par tes soins ?

    Plusieurs remarques et questions,
    1. Pourquoi utiliser typing d'un seul coup ? Quel intérêt à part ajouter une couche de complexité supplémentaire ? Qui puis est mal utilisé...
    2. Atexit ? Pourquoi ?
    3. La fonction crack_dict devrait retourner un objet selon ta déclaration de type, mais ça ne retourne rien
    4. J'ai pas compris la cohérence entre mot_fr ligne 24 et 26, et surtout encore une confusion avec les types (là c'est Any, sauf que c'est mal déclaré et ce n'est pas vrai !)
    5. Où est définie la variable lettres ?
    6. Ligne 38, n'hérite pas d'Exception, donc ça marche pas !
    7. Ligne 55, la variable haslib peut être définie à la valeur None, et ça risque de poser problème.


    Conclusion, fait simple ! Vire les types, tu sais pas, ou celui qui t'as aidé ne sait pas les utiliser !

    Bref si ça fonctionne, c'est parce-que tu n'as pas testé toutes les éventualités !

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Bonjour à tous,

    Non, le code fonctionnel n'est pas de moi, c'était codé en python 3.8 et avec pycharm 2020 et le code fonctionne.

    Ne me reste plus qu'à bosser et je reprendrai ce code un peu plus tard.

    Merci à vous pour tous ces retours,

    @plus

Discussions similaires

  1. [Python 3.X] AttributeError: 'NoneType' object has no attribute 'write'
    Par myth2104 dans le forum Général Python
    Réponses: 2
    Dernier message: 07/07/2015, 01h37
  2. Réponses: 3
    Dernier message: 04/03/2014, 22h41
  3. Réponses: 2
    Dernier message: 06/07/2012, 19h38
  4. AttributeError "nonetype" object has no attribute
    Par Invité dans le forum Général Python
    Réponses: 2
    Dernier message: 14/12/2010, 20h49
  5. Réponses: 2
    Dernier message: 26/05/2006, 14h48

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