2012-06-12 29 views
8

Tengo el siguiente código en el que intento permitir que el usuario abra un archivo de texto y una vez que el usuario lo haya seleccionado, me gustaría que el código lo lea (esto no es un bloque de código terminado, solo para mostrar lo que estoy buscando).Abrir y leer un archivo con askopenfilename

Sin embargo, estoy teniendo dificultades ya sea usando tkFileDialog.askopenfilename y agregando 'mode =' rb '' o usando el código siguiente y usando read donde produce un error.

¿Alguien sabe cómo puedo hacer esto porque no quiero tener que escribir Tkinter.'module 'para cada elemento, como Menú y Listbox? ¡Principiante a Tkinter y un poco confundido! ¡Gracias por la ayuda!

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

Obviamente el error que estoy recibiendo aquí es:

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

No entiendo cómo utilizar el askopen y también ser capaz de leer el archivo que estoy abriendo.

+0

Es posible que desee comenzar con un problema más fácil: se puede escribir un programa Python que se abre y se imprime un archivo específico, dicen '/ etc/passwd' o algún otro sencillo, conocido a-existir, archivo? – sarnold

+0

He trabajado anteriormente con la lectura y escritura de archivos de texto, pero nunca he usado Tkinter y estoy un poco confundido después de abrir un archivo de cómo funciona. ¿Tendría que quitar el nombre del archivo? – user2063

Respuesta

6

askopenfilename solo devuelve un nombre de archivo, lo que usted quería era askopenfile que acepta un parámetro mode y abre el archivo por usted.

+0

¡Una respuesta tan simple que funcionó, gracias! – user2063

7

El filename en el código de muestra es solo eso, una cadena que indica el nombre del archivo que desea abrir. Debe pasarlo al método open() para devolver un identificador de archivo para el nombre. Luego puede leer desde el manejador de archivos.

Aquí hay algunos códigos rápidos y sucios para ejecutar directamente en el intérprete de Python. (Usted puede ejecutar esto en un script, también, pero me gusta mucho REPL las interfaces para tratar rápidamente las cosas. Es posible que como él también.)

$ 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 sobre todo que no hay nada Tkinter-específica en la lectura el archivo - el cuadro de diálogo solo le da un nombre de archivo.

+0

es posible que pueda navegar por los archivos de la máquina remota a través de 'askopenfilename' u otro comando – Fahadkalis

0

Su error es el nombre de su función. Simplemente cambié def open() por def open1() y funciona.

def open1(): 

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

"abrir" no es invocado por la función abierta en la pregunta original. En su ejemplo, parece que habría definido una función recursiva, pero ¿de dónde proviene su función? – RufusVS

Cuestiones relacionadas