2012-06-12 127 views
8

我有下面的代碼,我試圖讓用戶打開一個文本文件,並且一旦用戶選擇了它,我希望代碼讀取它(這不是一個完整的代碼塊,只是爲了展示我的後面)。用askopenfilename打開和讀取文件

但是,我使用tkFileDialog.askopenfilename並添加'mode ='rb''或使用下面的代碼和使用讀取它會產生一個錯誤的困難。

有誰知道我可以如何安排這樣做,因爲我不希望爲每個項目(如Menu和Listbox)輸入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程序,說'在/ etc/passwd'或其他一些簡單的,已知對存在,文件? – sarnold

+0

我以前曾使用過讀寫文本文件,但從未使用過Tkinter,打開文件後它有點困惑。我需要剝去文件名嗎? – user2063

回答

6

askopenfilename只返回一個文件名,你想要的是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