首页 > 解决方案 > 程序无法通过 write 方法

问题描述

这是我的代码:

with open('exr.txt','r+') as exr:
    while True:
        exr.write((input('enter your name ')+'\n'))
        b=exr.readlines()
        if 'q' in b:
            break
    print('names entered:')
    for c in b:
        print('-',c)

它永远不会通过 write() 方法,即使在输入“q”后也会不断提示我输入名称,感谢任何帮助

标签: pythonpython-3.xloopsfilewhile-loop

解决方案


您的方法存在(至少)三个问题:

  1. 似乎exr.readlines()在这里没有按您的预期工作r+,因此"q"未读取在当前“会话”中输入的
  2. 与此相反,读取前一个会话"q"输入的 a ,因为它们保留在名称文件中,即循环在以后的任何执行中立即中断
  3. 您正在测试是否"q"是 in b,但是您将 a 附加\n到每个输入,并readlines包含那些行尾字符,因此b只能包含"q\n"

似乎读取和写入都使用文件中的相同位置。您可以使用 获取位置exr.tell()并使用 设置它exr.seek(x)。这样,您可以看到:

  • 在循环的开头exr.tell(),即位置在0,这意味着您的第一个write将覆盖文件开头的任何数据
  • 之后write,位置为k+1带有k字母的名称和附加的\n
  • 现在从该位置(即您刚刚输入的名称之后)readlines读取所有数据直到文件末尾
  • 现在,文件位置在末尾,所有后续write调用都会将名称附加到文件末尾,将文件位置进一步推进到新的末尾,并且readlines不会读取任何内容,因为指针已经在文件末尾

可以使用exr.seek(0)将文件中的位置重置为开头(或最后一行之前的任何其他位置),但是虽然这(与 3. 一起)解决了直接问题,但您仍然不应该这样做。

相反,只需将输入存储在一个变量中,并在将其添加到文件或中断循环之前检查该变量的值。

with open('exr.txt', 'a') as exr:
    while True:
        name = input('enter your name ')
        if name == "q":
            break
        else:
            exr.write(name + '\n')

推荐阅读