Python - 从用户读取和写入输入

时间:2011-11-23 05:53:19

标签: python file-io

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

我想要完成的事情:  1.编写一个使用while循环接受用户输入的程序(如果用户按Enter键退出程序)。  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”语句仍然是最佳做法吗?

  3. 示例:

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

2 个答案:

答案 0 :(得分:5)

老实说,你所展示的程序实在太乱了。我说这不是侮辱,但是因为你确实有一个非常明确的程序列表需要采取的步骤,我认为通过废弃现有代码并从头开始,你将获得更好的理解。

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

  1. 启动时,显示文件的任何先前内容
  2. 使用while循环
    1. 接受来自用户的输入
    2. 如果用户按Enter键,退出程序
    3. 将输入保存到文件
    4. 打印它( note :你的意思是打印最新的输入,还是文件中的所有内容?)
  3. 将您的整体任务转变为这样的特定步骤列表可能是编写计算机程序的80%。剩下要做的就是将其翻译成代码。因此,我建议您考虑如何单独执行这些步骤。

    • 编写代码段以显示文件内容
    • 编写代码片段以读取用户输入的一行并将其存储在变量
    • 编写代码片段以检查变量的内容以查看它是否为空,如果是,则退出
    • 编写代码片段以将变量的内容追加到文件
    • 编写代码片段以打印变量(或文件的内容,如果这是您的意图)

    这些中的每一个都可以在一行或两行中完成,因此,您应该轻松地使用它们。一旦你完成了所有的部分,你需要做的就是将它们组合在一起:

    # 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语句,该语句立即终止循环。因此,如果if不为空,您将只能访问第二个string_input语句。这意味着条件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语句之外,甚至可能在{{{}之外。 1}}循环。这会给你一个while因为变量NameErrorn没有在程序中的那些点定义。它们在定义的块的末尾“到期”。有关这方面的更多信息,请阅读scoping。 (维基百科文章可能不是最佳介绍,但您可以搜索Stack Overflow和/或Web以获取更多资源。)

      

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

    是的,t语句对于Python来说相对较新,是推荐的“快速”文件I / O操作方式。基本上with块负责在最后关闭文件。例如,上面涉及with的代码段相当于

    d

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

答案 1 :(得分:0)

使用raw_input代替输入。

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

BTW,为什么不在程序退出时而不是在每个循环中写入数据?