关于文件io:Python – 从用户读取和写入输入

Python - read and write input from user

我在为我的Python类编写这个简短的程序时遇到了困难,我希望有人能提供一些帮助。

我想完成的工作:1。编写一个使用while循环接受用户输入的程序(如果用户按Enter,则退出该程序)。2。将输入保存到文件中,然后打印。三。启动后,程序将显示文件的当前内容。

例子:

第一次启动程序。

输入文本:这是输入

这是输入。

输入文本:更多文本

这是输入。更多的文本。

当你第二次启动程序时

这是输入。更多的文本。

输入文本:

等。

到目前为止我有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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。

再次感谢大卫帮助我更像一个程序员。结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

我尽量让代码保持苗条,现在它可以工作了。

以下是几个问题:

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

  • 在寻找答案的时候,我发现了这个。使用"with"语句仍然是最佳做法吗?

  • 例子:

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


    老实说,你的程序,正如你所展示的,有点混乱。我说这不是侮辱,而是因为你的程序需要采取的步骤清单非常清楚,我认为你最终会更好地理解,放弃现有的代码,从头开始。

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

  • 启动后,显示文件的任何先前内容
  • 使用while循环
  • 接受用户的输入
  • 如果用户按Enter键,则退出程序
  • 将输入保存到文件
  • 打印它(注意:您的意思是只打印最新的输入,还是打印文件中的所有内容?)
  • 把你的全部任务变成这样一个特定步骤的列表,这大概是写一个计算机程序工作的80%。剩下要做的就是把它翻译成代码。因此,我建议您考虑如何单独执行这些步骤。

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

    每一个都可以在一行或两行中完成,因此单独地,您应该可以轻松地与他们相处。一旦你完成了所有的部分,你所需要做的就是把它们放在一起:

    1
    2
    3
    4
    5
    6
    # 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)

    更新:这不是什么大问题,但是你在你的修改计划中有一个不必要的EDOCX1(第二个)声明。考虑一下:如果string_input为空,python将执行break语句,这将立即终止循环。因此,只有当string_input不为空时,您才能访问第二个if语句。这意味着在程序中,条件string_input !=""在该点上保证是真实的,并且不需要检查它。

    Do I need to close the file at the end? When I tried to close apnd and n , It gave me errors.

    是的。看看你和d一起使用的模式:

    1
    2
    3
    4
    5
    6
    # 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在程序中的那些点上没有定义。它们在所定义的块的末尾"过期"。有关这方面的更多信息,请阅读范围界定。(维基百科的文章可能不是最好的介绍,但您可以搜索堆栈溢出和/或Web以获取更多资源。)

    While looking for answers I came a across, this. Is it still best practice to use a"with" statement?

    是的,with语句对于python来说是比较新的,是执行类似这样的"快速"文件I/O操作的推荐方法。基本上,with块负责在末尾关闭文件。例如,上面涉及d的代码段等价于

    1
    2
    3
    4
    5
    # 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

    *这种"打开读/写-关闭"的文件访问模式通常是个好主意。我告诉过你在你的程序中使用它,因为学习如何将一个程序分成几个小步骤,并将每个步骤单独转换成代码对你很重要。但是,当你在写一个程序,这个程序会重复地把东西写到一个文件中,或者从一个文件中读取它们,有时实际上,最好是一开始就打开一次文件,然后保持它的打开状态,而不是每次都打开和关闭它。如果您好奇,可以研究一件事,那就是如何修改您的程序,以减少打开和关闭文件的次数。


    使用原始输入而不是输入。

    您忘记在while循环中调用input

    顺便问一下,为什么不在程序的出口而不是在每个循环中写入数据呢?