2012-06-12 2 views
8

У меня есть следующий код, где я пытаюсь разрешить пользователю открывать текстовый файл, и как только пользователь его выбрал, я бы хотел, чтобы код его прочитал (это не готовый блок кода, чтобы показать, что мне нужно).Открытие и чтение файла с askopenfilename

Однако у меня возникают трудности с использованием tkFileDialog.askopenfilename и добавлением 'mode =' rb '' или с использованием кода, как показано ниже, и с помощью чтения, где он создает ошибку.

Кто-нибудь знает, как я могу договориться об этом, поскольку я не хочу набирать Tkinter.'module для каждого элемента, такого как Меню и Список. Начинающий от Tkinter и немного смущенный! Спасибо за помощь!

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

Очевидно, что ошибка я получаю здесь:

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

Я не понимаю, как использовать askopen, а также быть в состоянии прочитать файл я открываю.

+0

Вы можете начать с более простой проблемой: вы можете написать программу на Python, которая открывает и печатает конкретный файл, скажем, '/ и т.д./passwd' или некоторые другие простые, известные к EXIST, файл? – sarnold

+0

Я ранее работал с чтением и записью текстовых файлов, но никогда не использовал Tkinter и немного смущен после открытия файла, как он работает. Должен ли я отключить имя файла? – user2063

ответ

6

только возвращает имя файла, то, что вы хотели, было askopenfile, которое принимает параметр mode и открывает файл для вас.

+0

Такой простой ответ, который сработал, спасибо! – user2063

7

filename в вашем примере кода - это строка, указывающая имя файла, который вы хотите открыть. Вам необходимо передать это методу open(), чтобы вернуть дескриптор файла для имени. Затем вы можете прочитать из дескриптора файла.

Вот вам быстрый и грязный код, который запускается непосредственно в интерпретаторе Python. (Вы можете запустить это в сценарий, тоже, но мне очень нравится REPL интерфейсы для быстрого пытается вещи. Вы можете, как и его.)

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

Примечание особенно нет ничего Tkinter конкретных чтения файл - диалоговое окно просто дает вам имя файла.

+0

возможно, что я могу просматривать файлы удаленной машины через 'askopenfilename' или другую команду – Fahadkalis

0

Ваша ошибка - это имя вашей функции. Я просто изменил def open() на def open1(), и он работает.

def open1(): 

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

«open» не вызывается функцией open в исходном вопросе. В вашем примере, похоже, вы бы определили рекурсивную функцию, но откуда взялась ваша функция? – RufusVS

Смежные вопросы