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

0 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
Run Code Online (Sandbox Code Playgroud)

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

肯定:输入被记录到文本文件中.如果未输入任何文本,退出任何先前输入的文本时都会正确显示.

就像我说的,这是我的功课.我已经搜索了答案,但我似乎将代码分开并将它重新组合在一起只是为了得到不同的错误.因此,我们将非常感谢对此的一些指导.

我忘了提到的一件事是我使用的是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)
Run Code Online (Sandbox Code Playgroud)

我试图让代码尽可能地保持苗条,现在它可以工作了.

一对夫妇提出了另外一些问题:

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

  2. 在寻找答案时,我遇到了这个问题.使用"with"语句仍然是最佳做法吗?

例:

with open("x.txt") as f:
    data = f.read()
    do something with data
Run Code Online (Sandbox Code Playgroud)

Dav*_*d Z 5

说实话,你所展示的程序有点混乱.我说这不是侮辱,但是因为你确实有一个非常明确的程序列表,你可以通过废弃现有的代码并从头开始来更好地理解.

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

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

将您的整体任务转变为这样的特定步骤列表可能是编写计算机程序的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)
Run Code Online (Sandbox Code Playgroud)

更新:这不是什么大问题,但您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()
Run Code Online (Sandbox Code Playgroud)

你应该做同样的事情,每次你打开一个文件,即随着时间的推移intext,t以及n:打开它,从它读,然后立即关闭它.*

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

在寻找答案时,我遇到了这个问题.使用"with"语句仍然是最佳做法吗?

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

# 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
Run Code Online (Sandbox Code Playgroud)

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