【问题标题】:Python - read and write input from userPython - 从用户读取和写入输入
【发布时间】:2011-11-23 05:53:18
【问题描述】:

我在为我的 python 课程编写这个简短的程序时遇到了麻烦,我希望有人可以提供一些帮助。

我想要完成的事情: 1. 编写一个程序,使用while循环来接受用户的输入(如果用户按下回车,退出程序)。 2. 将输入保存到文件中,然后打印。 3. 启动后,程序会显示文件的当前内容。

例子:

第一次启动程序。

输入文本:这是输入

这是输入。

输入文本:更多文本

这是输入。还有一些文字。

当你第二次启动程序时

这是输入。还有一些文字。

输入文字:

等等。等等

到目前为止我所拥有的:

intext = open('user_input.txt','a')
intext.close()
string_input = input('Enter text: ')
while True:
    open_input = open('user_input.txt','r')
    if open_input:
        for i in open_input:
            print(i)

    if string_input != "":
        uinput = open('user_input.txt','a')
        uinput.write(string_input + '.')
        uinput.close()
        rd = open('user_input.txt', 'r')
        if rd:
            for line in rd:
                print(line)

    if string_input == "":
        t = open('user_input.txt', 'r')
        for line in t:
            print(line)
        t.close()
        break

问题:打开后,任何以前存储的文本都不会显示。如果用户输入文本,它会无限循环打印,并且不会提示再次输入文本。

正面:输入被记录到文本文件中。如果没有输入文本,退出时任何先前输入的文本都会正确显示。

就像我说的,这是我的功课。我已经寻找答案,但我似乎将代码拆开并将其重新组合在一起只是为了得到不同的错误。因此,我们将非常感谢您对此提供一些指导。

我忘记提及的一件事是我使用的是 Python 3。


再次感谢 David 帮助我像程序员一样思考。结果如下:

intext = open('user_input.txt','r').readline()
print(intext)
while True:
    string_input = input('Enter text: ')
    if string_input == "":
        t = open('user_input.txt', 'r').readline()
        print(t)
        break
    if string_input != "":
        d = open('user_input.txt', 'a')
        d.write(string_input + '. ')
        d.close()
        n = open('user_input.txt', 'r').readline()
        print(n)

我试图让代码尽可能精简,现在它可以工作了。

由此产生的一些附加问题:

  1. 我需要在最后关闭文件吗?当我试图关闭 apndn 时,它给了我错误。

  2. 在寻找答案时,我遇到了this。使用“with”语句仍然是最佳做法吗?

例子:

with open("x.txt") as f:
    data = f.read()
    do something with data

【问题讨论】:

    标签: python file-io


    【解决方案1】:

    说实话,您展示的程序有点乱。我说这不是侮辱,而是因为您确实有一个非常清晰的程序需要执行的步骤列表,并且我认为您最终会通过废弃现有代码并从头开始更好地理解。

    在您的问题中,您列出了以下步骤:

    1. 启动时,显示文件的任何先前内容
    2. 使用while 循环
      1. 接受用户的输入
      2. 如果用户按下回车,退出程序
      3. 将输入保存到文件中
      4. 打印它(注意:您的意思是只打印最新的输入,还是打印文件中的所有内容?)

    将您的整体任务变成这样的具体步骤列表可能是编写计算机程序工作的 80%。剩下要做的就是将其转换为代码。因此,我建议您考虑如何单独执行每个步骤。

    • 编写代码 sn -p 显示文件内容
    • 编写代码 sn-p 以读取用户输入的一行并将其存储在变量中
    • 编写代码sn-p,检查变量的内容是否为空,如果是则退出
    • 编写代码 sn-p 将变量的内容附加到文件中
    • 编写代码 sn-p 以打印变量(或文件,如果您要这样做的话)的内容

    这些中的每一个都可以在一两行中完成,因此,您应该与它们一起度过轻松的时光。完成所有部分后,您需要做的就是将它们放在一起:

    # display the contents of the file
    while True:
        # read a line of input and store it in a variable
        # check the contents of the variable to see if it's empty, and if so, exit
        # append the contents of the variable to the file
        # print the contents of the variable (or of the file)
    

    更新:这没什么大不了的,但是您修改后的程序中有一个不必要的if 语句(第二个)。想一想:如果string_input 为空,Python 将执行break 语句,该语句立即终止循环。因此,如果string_input 不为空,您只会到达第二个if 语句。这意味着条件string_input != ""在程序中保证为真,无需检查。

    我需要在最后关闭文件吗?当我试图关闭 apndn 时,它给了我错误。

    是的,你知道。看看你用d的模式:

    # open the file
    d = open('user_input.txt', 'a')
    # write to it (or read from it)
    d.write(string_input + '. ')
    # close it
    d.close()
    

    每次打开文件时都应该做同样的事情,即使用intexttn:打开它,读取它,然后立即关闭它。*支持>

    我猜你遇到错误的原因是你试图将.close() 语句放在程序末尾,在if 语句之外,甚至可能在while 循环之外。这会给你一个NameError,因为变量nt 没有在程序的这些点上定义。它们在定义它们的块的末尾“过期”。有关此的更多信息,请阅读scoping。 (维基百科的文章可能不是最好的介绍,但您可以搜索 Stack Overflow 和/或网络以获取更多资源。)

    在寻找答案时,我遇到了this。使用“with”语句仍然是最佳做法吗?

    是的,with 语句对于 Python 来说是相对较新的,并且是执行此类“快速”文件 I/O 操作的推荐方法。基本上with 块负责在最后关闭文件。比如上面涉及d的代码sn-p等价于

    # open the file
    with open('user_input.txt', 'a') as d:
        # write to it (or read from it)
        d.write(string_input + '. ')
    # Python "automatically" closes it for you
    

    *这种文件访问的“打开-读取/写入-关闭”模式通常是个好主意。我已经告诉你在你的程序中使用它,因为学习如何将程序拆分为小步骤并将每个步骤单独转换为代码对你来说很重要。但是,当您编写的程序反复将内容写入文件或从文件中读取内容时,有时实际上最好只在开始时打开文件一次并保持打开状态,而不是打开和关闭它每次。如果您很好奇,您可以研究的一件事是如何修改您的程序以减少它必须打开和关闭文件的次数。

    【讨论】:

    • 感谢您的诚实。我会后退一步,采用更有条理的方法。
    【解决方案2】:

    使用 raw_input 代替 input。

    你忘记在while循环中调用输入

    顺便说一句,为什么不在程序退出时而不是在每个循环中写入数据?

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2019-09-01
      • 2013-11-04
      • 1970-01-01
      相关资源
      最近更新 更多