首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本反向写入

脚本反向写入
EN

Stack Overflow用户
提问于 2016-06-30 20:39:51
回答 4查看 78关注 0票数 0

对不起,如果我问错了,或者格式化错了,这是我第一次来这里。基本上,这个脚本是一个非常非常简单的文本编辑器。问题是,当它写入文件时,我希望它写:

代码语言:javascript
复制
Hi, my name
is bob.

但是,它写道:

代码语言:javascript
复制
is bob.
Hi, my name

我怎么才能解决这个问题?守则如下:

代码语言:javascript
复制
import time
import os
userdir = os.path.expanduser("~\\Desktop")
usrtxtdir = os.path.expanduser("~\\Desktop\\PythonEdit Output.txt")
def editor():
    words = input("\n")
    f = open(usrtxtdir,"a")
    f.write(words + '\n')
    nlq = input('Line saved. "/n" for new line. "/quit" to quit.\n$ ')
    if(nlq == '/quit'):
        print('Quitting. Your file was saved on your desktop.')
        time.sleep(2)
        return
    elif(nlq == '/n'):
        editor()
    else:
        print("Invalid command.\nBecause Brendan didn't expect for this to happen,\nthe program will quit in six seconds.\nSorry.")
        time.sleep(6)
        return
def lowlevelinput():
    cmd = input("\n$ ")
    if(cmd == "/edit"):
        editor()
    elif(cmd == "/citenote"):
        print("Well, also some help from internet tutorials.\nBut Brendan did all the scripting!")
        lowlevelinput()
print("Welcome to the PythonEdit Basic Text Editor!\nDeveloped completley by Brendan*!")
print("Type \"/citenote\" to read the citenote on the word Brendan.\nType \"/edit\" to begin editing.")
lowlevelinput()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-30 20:53:57

很好的谜题。为什么这些线是相反的?由于输出缓冲:

当您写入文件时,系统不会立即将数据提交到磁盘。这是定期发生的(当缓冲区已满时),或当文件被关闭时。你从不关闭f,所以当f超出范围时,它就会关闭.这在函数editor()返回时发生。但是editor() 递归地调用自己!因此,对editor()的第一个调用是最后一个退出的调用,其输出是最后一个提交到磁盘的调用。很好,嗯?

要解决此问题,只需在编写完以下内容之后立即关闭f

代码语言:javascript
复制
f = open(usrtxtdir,"a")
f.write(words + '\n')
f.close()   # don't forget the parentheses

或相当于:

代码语言:javascript
复制
with open(usrtxtdir, "a") as f:
    f.write(words + '\n')

但最好是修复您的项目的组织:

  1. 使用循环运行editor(),而不是递归调用。
  2. 编辑器应该在会话结束时写出文件,而不是每行输入。考虑收集一个行列表中的用户输入,最后一次把所有内容都写出来。
  3. 如果您确实想要一边写一边写,您应该只打开文件一次,重复写,然后在完成时关闭它。
票数 2
EN

Stack Overflow用户

发布于 2016-06-30 20:55:28

您需要在编写完文件后,在尝试再次打开它之前关闭它。否则,在程序关闭之前,您的写操作将无法完成。

代码语言:javascript
复制
def editor():
    words = input("\n")
    f = open(usrtxtdir,"a")
    f.write(words + '\n')
    nlq = input('Line saved. "/n" for new line. "/quit" to quit.\n$ ')
    f.close()  # your missing line!
    if(nlq == '/quit'):
        print('Quitting. Your file was saved on your desktop.')
        time.sleep(2)
        return
    elif(nlq == '/n'):
        editor()
    else:
        print("Invalid command.\nBecause Brendan didn't expect for this to happen,\nthe program will quit in six seconds.\nSorry.")
        time.sleep(6)
        return
票数 1
EN

Stack Overflow用户

发布于 2016-06-30 20:52:43

如果您替换:

代码语言:javascript
复制
f = open(usrtxtdir,"a")
f.write(words + '\n')

通过以下方式:

代码语言:javascript
复制
with open(usrtxtdir,"a") as f:
    f.write(words + '\n')

它是按顺序出来的。几乎总是使用with open()进行文件访问。它自动为您处理文件的关闭,即使在崩溃的情况下也是如此。尽管您可能会考虑在内存中使用文本,并且只在退出时才编写它。但这并不是眼前问题的一部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38132854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档