web-dev-qa-db-fra.com

Ouverture et lecture d'un fichier avec askopenfilename

J'ai le code suivant dans lequel j'essaie de permettre à l'utilisateur d'ouvrir un fichier texte et une fois que l'utilisateur l'a sélectionné, j'aimerais que le code le lise (ce n'est pas un bloc de code fini, mais juste pour montrer ce que Je suis après).

Cependant, j'ai des difficultés à utiliser tkFileDialog.askopenfilename et à ajouter 'mode =' rb '', ou bien à utiliser le code comme ci-dessous et à read où cela produit une erreur.

Est-ce que quelqu'un sait comment je peux m'arranger pour faire cela car je ne souhaite pas avoir à taper Tkinter.'module 'pour chaque élément tel que Menu et Listbox. Débutant à Tkinter et un peu confus! Merci pour l'aide!

import sys
from Tkinter import *
import tkFileDialog
from tkFileDialog import askopenfilename # Open dialog box

fen1 = Tk()                              # Create window
fen1.title("Optimisation")               #

menu1 = Menu(fen1)

def open():

    filename = askopenfilename(filetypes=[("Text files","*.txt")])
    txt = filename.read()
    print txt
    filename.close()

fen1.mainloop()

Évidemment, l'erreur que j'obtiens ici est la suivante:

AttributeError: 'unicode' object has no attribute 'read'

Je ne comprends pas comment utiliser askopen et comment lire le fichier que je suis en train d'ouvrir.

9
user2063

askopenfilename ne renvoie qu'un nom de fichier. askopenfile acceptait un paramètre mode et ouvrait le fichier pour vous.

8
alexisdm

La filename de votre exemple de code est simplement cela: une chaîne indiquant le nom du fichier que vous souhaitez ouvrir. Vous devez passer cela à la méthode open() pour renvoyer un descripteur de fichier pour le nom. Vous pouvez ensuite lire à partir du descripteur de fichier.

Voici un code rapide et sale à exécuter directement dans l'interpréteur Python. (Vous pouvez exécutez ceci dans un script aussi, mais j'aime vraiment beaucoup les interfaces REPL pour pouvoir l'essayer rapidement. Vous pouvez aussi aimer.

$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
>>> from tkFileDialog import askopenfilename
>>> root = Tkinter.Tk() ; root.withdraw()
''
>>> filename = askopenfilename(parent=root)
>>> filename
'/tmp/null.c'
>>> f=open(filename)
>>> f.read()
'#include<stdio.h>\n\nint main()\n{\n  for(;NULL;)\n    printf("STACK");\n\n  return 0;\n}\n\n'
>>> f.close()
>>> 

Notez en particulier qu'il n'y a rien de spécifique à Tkinter lors de la lecture du fichier - la boîte de dialogue vous donne simplement un nom de fichier.

7
sarnold

Votre erreur est le nom de votre fonction. J'ai simplement changé def open() pour def open1() et cela fonctionne.

def open1():

    filename = askopenfilename(parent=fen1)
    print(filename)
    f = open(filename)
    txt = f.read()
    print txt
    f.close()
0
Mesbah Ahmed