2016-06-30 4 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 как только вы закончите писать:

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

Или эквивалент:

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() документации Python гласит: «Из-за буферизации, строка не может фактически отображаться в файле, пока метод 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() 

Кроме того, не забудьте закрыть файл после того, как вы сделали с ним!

Смежные вопросы