2012-06-12 15 views
8

Ho il seguente codice in cui sto cercando di consentire all'utente di aprire un file di testo e una volta che l'utente lo ha selezionato, vorrei che il codice lo leggesse (questo non è un blocco di codice finito, solo per mostrare cosa sto cercando).Apertura e lettura di un file con askopenfilename

Tuttavia, sto riscontrando difficoltà nell'utilizzare tkFileDialog.askopenfilename e l'aggiunta di 'mode =' rb '' o l'utilizzo del codice come di seguito e l'utilizzo di read dove produce un errore.

Qualcuno sa come posso fare questo perché non desidero digitare Tkinter.module per ogni elemento come Menu e Listbox. Principiante di Tkinter e un po 'confuso! Grazie per l'aiuto!

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() 

Ovviamente l'errore che sto ottenendo qui è:

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

Non capisco come usare l'askopen e anche essere in grado di leggere il file sto aprendo.

+0

Si potrebbe desiderare di iniziare con un problema di più facile: si può scrivere un programma Python che si apre e stampa un file specifico, dicono '/ etc/passwd' o qualche altro semplice, noto a-esistere, il file? – sarnold

+0

Ho già lavorato con la lettura e la scrittura di file di testo, ma non ho mai usato Tkinter e sono un po 'confuso dopo aver aperto un file come funziona. Dovrei rimuovere il nome del file? – user2063

risposta

6

askopenfilename restituisce solo un nome file, quello che volevi era askopenfile che accetta un parametro mode e apre il file per te.

+0

Una risposta così semplice che ha funzionato, grazie! – user2063

7

Lo filename nel codice di esempio è proprio questo: una stringa che indica il nome del file che si desidera aprire. È necessario passare questo al metodo open() per restituire un handle di file per il nome. È quindi possibile leggere dall'handle del file.

Ecco un codice veloce e sporco da eseguire direttamente nell'interprete Python. (È possibile eseguire questo in uno script, troppo, ma mi piace molto REPL interfacce per provare rapidamente le cose. È possibile, come pure.)

$ 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() 
>>> 

Nota soprattutto che non c'è niente Tkinter-specifici nella lettura il file - la finestra di dialogo ti dà solo un nome.

+0

è possibile che sia in grado di navigare i file della macchina remota attraverso 'askopenfilename' o altro comando – Fahadkalis

0

Il tuo errore è il nome della tua funzione. Ho semplicemente cambiato def open() per def open1() e funziona.

def open1(): 

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

"open" non viene chiamato dalla funzione open nella domanda originale. Nel tuo esempio sembra che avresti definito una funzione ricorsiva, ma da dove viene la tua funzione? – RufusVS