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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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()"

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  5. #5
    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

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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]

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  9. #9
    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 !

  10. #10
    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