j'ai un problème au niveau de mon programme "object has no atribute 'read' pourriez vous m’éclaircir ?

0 votes
def cryptage():
    nomdufichiersource=value1.get()
    os.chdir("C:\\testspython")
    fichiersource=open(nomdufichiersource, "r")
    contenu = nomdufichiersource.read()
    print(contenu)
    tabletext=[ord(i) for i in contenu]
    tablecrypt=[]
    messagecrypte=[]
    for i in tabletext:
        if i==32:
            z=i
        else:
            z=i+1
    tablecrypt.append(z)
    messagecrypte=[chr(i) for i in tablecrypt]
    nomdufichiersortie= messagecrypte.write()

voila ma def de décryptage dans mon programme qui va chercher un fichier le lit puis décrypte les caractère un par un en les décalant en ascci .

demandé 31-Dec-2015 par anonyme
edité 31-Dec-2015 par yoch

4 Réponses

+2 votes

Fait un clické-glissé sur ton code et click ensuite sur les accolades pour que ton code apparaisse proprement.

que te donnes :

print(nomdufichiersource)

c'est mieux d'ouvrir ton fichier comme ça:

with open('fichier.txt', 'r') as mon_fichier:

     texte = mon_fichier.read()
répondu 31-Dec-2015 par buffalo974 (2,956 points)
+3 votes

C'est parce que tu appelles read sur le nom du fichier, au lieu du fichier ouvert.
Remplace simplement nomdufichiersource.read() par fichiersource.read().

De même, cette ligne ne fait pas vraiment sens :

nomdufichiersortie= messagecrypte.write()
répondu 31-Dec-2015 par yoch (2,514 points)

C'est parceque je veut un fichier de sortie ou les caractères du fichier d'entré sont inscrit en crypté mais je veut que mon programme donne le nom de ce nouveau fichier mais je crois que le .write remplace juste le fichier d'entré directement réécrit directement dedans .

Je ne comprend pas grand chose à ta réponse, mais est-ce que tu te rend bien compte qu'un nom de fichier n'a rien à voir avec un fichier, du point de vue de python ?

Un nom est une simple chaîne de caractères, tandis qu'un fichier est on objet permettant de manipuler le fichier physique. Quant à la méthode write, elle ne peut pas être appelée sur une liste, mais uniquement sur un fichier, et il faut lui passer la chaîne à écrire en argument.

Bref, ton code est incohérent. Pour ton dernier problème, tu dois tout d'abord ouvrir un fichier en mode WRITE, puis y écrire le contenu de ta liste :

fichiersortie.write(''.join(messagecrypte))

(on transforme la liste en chaîne avec join, puis on écrit la chaîne obtenue dans le fichier précédemment ouvert)

Je suis débutant sur python et donc d’après ce que tu dis un nom de fichier n'a rien avoir avec un fichier je ne comprend pas trop je t'explique en gros ce que j'ai essayé de faire avec mon programme qui contient une interface graphique. Donc je demande a l'utilisateur de donner dans la fenêtre de mon programme ou il ya marqué nomdufichiersource le nom justement du fichier qui contient du caractères basique comment exemple j'ai créé un fichier.txt donc je veut que l'utilisateur rentre fichier.txt qui est déjà créé puis il appuie sur le bouton crypté et c'est la que mon programme ouvre le fichier prend les caractères les cryptes avec chr et ord puis je voudrais qu'il crée un nouveau fichier ou il y dépose les caractères crypté ou tous simplement que les caractères crypté soit dans le fichier.txt de base qu'il est prit la place des caractères de base j'aimerais ajouter d'autre fonction mais avant tous j'aimerais qu'il marche . J’espère que tu a un peu mieux compris le but de mon programme mais je contrôle pas très bien les commande d'ouverture de fichier puis écriture et je confond comme tu dis avec le nomdufichier mais je ne fait pas la différence pourrait tu m'expliqué exemple un fichier.txt son nom est bien fichier.txt ? es cela qui faut que je demande a l'utilisateur ou le chemin pour y accéder? je me pose de nombreuses questions

Il faut bien comprendre que python t'autorise à faire certaines choses qui ici t'embrouillent l'esprit. Chaque ligne de ton code doit être bien comprise, sans cela tu fais n'importe quoi à un moment ou un autre.

Admettons que tu as un fichier nommé "fichier1.txt", ce nom étant dans un variable nomFichierEntree. lorsque tu va ouvrir le fichier, il faut mieux utiliser une seconde variable, histoire de comprendre ce que tu fais : fichierEntree = open(nomFichierEntree, "r"). Là, c'est déja beaucoup plus clair ce que fait chaque variable.

Ensuite, tu as une table de caractères cryptés, que tu veux stocker dans un second fichier. Ce nouveau fichier, il va falloir le créer, et pour ça il va falloir un nom. Admettons que le nom se compose du nom original plus le suffixe ".crypt", ceci nous donne nomFichierSortie = nomFichierEntree + ".crypt". Ensuite seulement, tu peux ouvrir ce fichier en écriture, par exemple avec 'fichierSortie = open(nomFichierSortie, "w") (note bien le "w" au lieu de "r" dans le premier cas).

Une fois le fichier en sortie ouvert, tu peux écrire dedans. Mais pour écrire quelque chose, il faut que ce soit du texte. Or ta variable messagecrypte est une liste de caractères, et non une chaîne. c'est pour cela qu'il faut d'abord convertir cette liste en chaine, par exemple en faisant sortie = ''.join(messagecrypte), et ensuite seulement tu pourras faire : fichierSortie.write(sortie).

(bon, c'est pas que, mais il va sans doute falloir revoir ton cryptage lui aussi...)

Bonjour d’après ce que tu ma dit je comprend ça:

def cryptage():
     fichierEntree=value1.get()
    fichierEntree = open(fichierEntree, "r")
    contenu =fichierEntree.read()
    print(contenu)
    tabletext=[ord(i) for i in contenu]
    tablecrypt=[]
    messagecrypte=[]
    for i in tabletext:
        if i==32:
            z=i
        else:
            z=i+1
    tablecrypt.append(z)
    messagecrypte=[chr(i) for i in tablecrypt]
    sortie = ''.join(messagecrypte)
    nomFichierSortie = nomFichierEntree + ".crypt"
    fichierSortie = open(nomFichierSortie, "w")
    fichierSortie.write(sortie) 

mais le open(nomfichierEntree,"r") c'est en read ducoup mon contenu=fichierEntree.read() il me sert plus a rien ? et aussi mon programme de cryptage et de décryptage marche très jai les deux fenêtres a part tu peut essayer si tu veut sa fonctionne a merveille et merci de m'aider j'ai juste un problème pour l'ouverture et écriture de fichier c'est tous mon interface graphique marche aussi.
Je te montre ma fenêtre spéciale cryptage essaye la et dit moi ce que tu en pense :)

from tkinter import *
def cryptage():
    text = champ.get()
    tabletext=[ord(i) for i in text]
    tablecrypt=[]
    messagecrypte=[]
    for i in tabletext:
        if i==32:
            z=i
        else:
            z=i+1
        tablecrypt.append(z)
    messagecrypte=[chr(i) for i in tablecrypt]
    string=''.join(messagecrypte)
    LabelR1.configure (text = string)

fenetre = Tk()
fenetre.title ("cryptage/décryptage")

Label1 = Label( fenetre,text = "ecrire du texte :")
Label1.pack(side = TOP)

texte = StringVar()
texte.set('')
champ = Entry(fenetre, textvariable = texte, bg = "white" , fg = "black")
champ.focus_set
champ.pack(side = TOP)

bouton1 = Button(fenetre, text = "cryptage", command = cryptage )
bouton1.pack()


LabelR1 = Label( fenetre, text = "texte crypté") 
LabelR1.pack()

bouton2 = Button(fenetre, text = "quitter", command = fenetre.quit)
bouton2.pack()



fenetre.mainloop()

fenetre.destroy()

PS:j'ai une nouvelle erreur ( unsupported operand type(s) for +: '_io.TextIOWrapper' and 'str') ce que je comprend c'est a la ligne nomfichiersortie=nomFichierEntree+"crypt" ya un problème avec le fait de rajouter crypte str c'est du caractère je me trompe ?

C'est illisible, tu devrais éditer ton message et utiliser les balises code, on ne peut pas le faire à ta place à chaque fois.

Bonjour yosh mon programme ce lance enfin il trouve bien le fichier car avant je ne m’étais pas le nom complet du chemin du fichier donc il le trouve l'ouvre affiche ce qu'il y a dedans cependant j'ai maintenant un problème dans ma def crypté lorsque que je lui demande de m'afficher le message crypté il m'affiche une lettre au lieu du message complet. or j'ai une fenêtre de mon programme de décryptage seul qui marche très bien voici le code de celle ci

from tkinter import *
def decryptage():
    text = champ.get()
    tabletext=[ord(i) for i in text]
    tablecrypt=[]
    messagecrypte=[]
    for i in tabletext:
        if i==32:
            z=i
        else:
                z=i-1
        tablecrypt.append(z)
    messagecrypte=[chr(i) for i in tablecrypt]
    string=''.join(messagecrypte)
    LabelR1.configure (text = string)
fenetre = Tk()
fenetre.title ("cryptage/décryptage")

Label1 = Label( fenetre,text = "ecrire du texte :")
Label1.pack(side = TOP)

texte = StringVar()
texte.set('')
champ = Entry(fenetre, textvariable = texte, bg = "pink" , fg = "blue")
champ.focus_set
champ.pack(side = TOP)

bouton1 = Button(fenetre, text = "cryptage", command = cryptage )
bouton1.pack()


LabelR1 = Label( fenetre, text = "string") 
LabelR1.pack()

bouton2 = Button(fenetre, text = "quitter", command = fenetre.quit)
bouton2.pack()



fenetre.mainloop()

fenetre.destroy()

théoriquement j'ai juste a l'introduire dans mon programme principale mais sa serait trop beau pourtant je ne trompe pas lorsque j'introduis directement ma def decrypter donc je ne comprend pas pourquoi elle marche toute seul mais quand je la rentre dans mon programme principale elle ne m'affiche pas le texte décrypter ou crypter.

+1 vote

Ce n'est pas :
nomdufichiersource.read()
mais
fichiersource.read()

nomdufichiersource est de type str et il n'y a pas de méthode read pour les objets de ce type.

répondu 1-Jan-2016 par hippo
0 votes
def cryptage():
    nomdufichiersource=value1.get()
    nomdufichiersource=open("C:\\testspython\\fichier.txt","r")
    contenu =nomdufichiersource.read()
    print(contenu)
    tabletext=[ord(i) for i in contenu]
    tablecrypt=[]
    messagecrypte=[]
    for i in tabletext:
        if i==32:
            z=i
        else:
            z=i+1
    tablecrypt.append(z)
    messagecrypte=[chr(i) for i in tablecrypt]
    nomdufichiersortie= messagecrypte.write()
    fichier.close()

J'ai un peu modifié mon algo mnt ma fenetre s'ouvre et le texte du fichier s'affiche cependant je veut que l'on puisse taper le nom du fichier donc c'est mon value.1get() donc que je programme prenne ce value puis l'ouvre car c'est le nom du fichier et lui applique ma boucle de cryptage ensuite je lui demande de le réécrire dans un autre fichier et de donner le nom de ce nouveau fichier voila et voici mon erreur ""AttributeError: 'list' object has no attribute 'write' ""

répondu 1-Jan-2016 par anonyme
edité 1-Jan-2016 par max
...