2016-06-30 2 views
0

죄송합니다. 잘못 입력했거나 잘못 포맷하면 죄송합니다. 여기 처음입니다. 기본적으로이 스크립트는 매우 간단한 텍스트 편집기입니다. 그것은 기록,스크립트가 역순으로 쓰여집니다.

Hi, my name 
is bob. 

을 :하지만

is bob. 
Hi, my name 

가 어떻게이 문제를 해결할 수는 파일에 쓸 때 문제는 내가 그것을 쓰고 싶어, 무엇입니까? 코드는 여기에 있습니다 :

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() 
+0

그런데 상황에 대해 메모를 추가하지 않아서 유감입니다. – Brendan

+0

어디에서 파일을 닫으시겠습니까? 쓰기 후에 닫으십시오. – Jerzyk

+0

코드는 여기에 따라야하지만, _think_ 문제는 호출 스택을 풀 때 예상되는 출력 순서를 반대로하는 입력 함수로 재귀한다는 것입니다. 그것은 단지 추측입니다. –

답변

2

멋진 퍼즐. 왜 선이 반대 방향으로 나오고 있습니까? 위로 가기 출력 버퍼링 때문에 :

파일에 쓸 때 시스템은 즉시 데이터를 디스크에 커밋하지 않습니다. 이것은 주기적으로 (버퍼가 꽉 찬 경우) 또는 파일이 닫힐 때 발생합니다. f을 절대로 닫지 않으므로 f이 범위를 벗어나면 닫힙니다 ... editor()이 반환 될 때 발생합니다. 그러나 editor()은 재귀 적으로 호출됩니다! 따라서 editor()에 대한 첫 번째 호출이 마지막으로 종료되며 출력이 디스크에 커밋 된 마지막 것입니다. 알았지?

f = open(usrtxtdir,"a") 
f.write(words + '\n') 
f.close() # don't forget the parentheses 

또는 동등한 : 당신이 작성 완료로

문제를 해결하려면, 바로 f를 닫 충분하다

with open(usrtxtdir, "a") as f: 
    f.write(words + '\n') 

그러나이 조직을 수정하는 것이 좋습니다 당신의 프로그램 :

  1. 루프를 사용하여 editor()을 실행하고 재귀 호출을 실행하지 마십시오.
  2. 편집기는 모든 줄 입력이 아니라 세션이 끝날 때 파일을 작성해야합니다. 행 목록에서 사용자 입력을 수집하고 끝에 모든 것을 쓰는 것을 고려하십시오.
  3. 이동 중에도 쓰고 싶다면 파일을 한 번만 열어서 반복해서 쓰고 끝내면 닫아야합니다.
0

바꿀 경우와

f = open(usrtxtdir,"a") 
f.write(words + '\n') 

:

with open(usrtxtdir,"a") as f: 
    f.write(words + '\n') 

이 순서대로 나온다. 거의 항상 파일 액세스에 with open()을 사용하십시오. 충돌이 발생하더라도 자동으로 파일 닫기를 처리합니다. 비록 메모리에서 텍스트를 가져 와서 종료시에만 텍스트를 쓰는 것을 고려할 수도 있습니다. 하지만 실제로 문제의 일부가 아닙니다.

1

다시 열려면 먼저 파일을 닫은 후에 파일을 닫아야합니다. 그렇지 않으면 프로그램이 닫힐 때까지 쓰기가 완료되지 않습니다.

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 
0

파이썬의 file.write() 문서 상태 : 당신이 반복적으로 파일 쓰기를 재개하고 있기 때문에

"는 flush() 또는 close() 메서드가 호출 될 때까지 때문에 버퍼링, 문자열이 실제로 파일에 표시 할 수 없습니다" 버퍼를 플러시하기 전에 내부 프레임 (bob이라고 쓰는 곳)이 완료되면 바깥 쪽 값 ('안녕하세요, 내 이름')이 아직 쓰여지지 않습니다. 그러면 자동으로 쓰기 버퍼.

당신은 file.flush를 추가 할 수 있어야한다()과 같이이를 정정합니다 :

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') 
    f.flush() # <----- ADD THIS LINE HERE -----< # 
    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() 

을 또한, 당신이 그것으로 완료 한 후 파일을 닫을 것을 잊지 마세요!

관련 문제