2016-12-22 1 views
1

Я пытаюсь получить доступ к содержимому файла, пока этот файл все еще обновляется. Ниже мой код, который делает записи в файл задания:Прочитайте файл, пока python все еще переписывает файл

for i in range(100000): 
    fp = open("text.txt", "w") 
    fp.write(str(i)) 
    fp.close() 
    #time.sleep(1) 

Моя проблема сейчас в том, что всякий раз, когда я пытаюсь открыть мой файл в то время как цикл все еще работает, я получаю пустой файл в текстовом редакторе (я кроме для просмотра «обновленного» номера). Мне интересно, есть ли способ, который позволяет мне просматривать содержимое файла до окончания цикла for?

Заранее спасибо за любую помощь:)

+0

Что вы ожидаете увидеть? – DaveQ

+0

Я ожидаю увидеть обновленный номер каждый раз, когда я открою файл. –

+0

, когда вы делаете 'fp = open (" text.txt ", 'w')' вы откатываете назад к началу файла, удаляете все. Он останется таким, как «commit», например, «fp.flush()». Это основная часть вашей деятельности во время цикла. Когда вы открываете файл, скорее всего, вы в такой период, и ничего не увидите. Вы можете изменить свой 'time.sleep (n)' на очень небольшое число, и вы тоже ничего не увидите. – DaveQ

ответ

4

Не открыть файл внутри для цикла. Это плохая практика и плохой код. Каждый раз, когда вы создаете новый объект. Вот почему вы получаете пустой файл.

fp = open("text.txt", "r+") 
for i in range(100000): 
    fp.seek(0) 
    fp.write(str(i)) 
    fp.truncate() 
fp.close() 
+0

Я действительно пытаюсь обновить файл с новым номером. Если я не буду пытаться использовать for-loop for open-out, что еще я могу сделать? –

+0

вы не можете стереть файл, если вам не нужно удалить конец. Или быть содержимым с заменой «пустого» значения, –

+0

Я не совсем понимаю, не могли бы вы привести мне пример? спасибо –

2

Буферный файл современных операционных систем для повышения производительности: несколько последовательных записей объединяются, прежде чем они будут записаны на диск. Если вы хотите, чтобы запись распространяться на диск немедленно, метод использования flush(), но помните, что это резко снижает производительность приложений:

with open("text.txt", "w") as fp: 
    for i in range(100000): 
    fp.write(str(i)) 
    fp.flush() 
0

При записи в файл обычно не на самом деле не будет записан на диск до тех пор, файл закрыт. Если вы хотите, чтобы это было написано сразу же вам нужно добавить flush на каждой итерации, следовательно:

fp = open("text.txt", "w") 
for i in range(100000): 
    fp.write(str(i)) 
    fp.write("\n") 
    fp.flush() 
fp.close() 
+0

Я действительно пытаюсь обновить файл с номером i, я обнаружил, что если я добавлю sleep в конец цикла for, он отлично работает, когда я открою файл (с обновленным номером), однако есть ли способ без сна? –

+0

flush() быстрее, когда вы используете сон, он сбрасывается, но вы теряете время спать. – MotKohn

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