【问题标题】:Opening and reading a file with askopenfilename使用 askopenfilename 打开和读取文件
【发布时间】:2012-06-12 08:36:00
【问题描述】:

我有以下代码,我试图让用户打开一个文本文件,一旦用户选择它,我希望代码读取它(这不是一个完成的代码块,只是显示我的追求)。

但是,我在使用 tkFileDialog.askopenfilename 并添加 'mode='rb'' 或使用如下代码并在产生错误时使用 read 时遇到了困难。

有谁知道我该如何安排这样做,因为我不希望为菜单和列表框等每个项目键入 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 也能够读取我正在打开的文件。

【问题讨论】:

  • 您可能希望从一个更简单的问题开始:您能否编写一个 Python 程序来打开并打印特定文件,例如 /etc/passwd 或其他一些简单的、已知存在的文件?
  • 我以前使用过读写文本文件,但从未使用过 Tkinter,打开文件后有点困惑它是如何工作的。我需要去掉文件名吗?

标签: python tkinter


【解决方案1】:

askopenfilename 只返回一个文件名,你想要的是askopenfile,它接受一个mode 参数并为你打开文件。

【讨论】:

    【解决方案2】:

    您的示例代码中的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 的内容——对话框只是为您提供文件名。

    【讨论】:

    • 是否可以通过askopenfilename或其他命令浏览远程机器的文件
    【解决方案3】:

    您的错误是您的函数的名称。我只是将def open() 更改为def open1(),它可以工作。

    def open1():
    
        filename = askopenfilename(parent=fen1)
        print(filename)
        f = open(filename)
        txt = f.read()
        print txt
        f.close()
    

    【讨论】:

    • "open" 不是由原始问题中的 open 函数调用的。在您的示例中,您似乎已经定义了一个递归函数,但是您的函数是从哪里来的?
    【解决方案4】:

    我认为你可以像这样阅读你的文件

    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 open1():
    
        filename = askopenfilename(filetypes=[("Text files","*.txt")])
        text1 = open(filename, r)
        read_file = text1.read()
        print(read_file)
        text1.close()
    
    fen1.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 2015-04-19
      • 2012-06-27
      • 1970-01-01
      • 2018-12-06
      • 2021-02-10
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多