Форум сайта python.su
Если файл остался открытым , то почему такой скрипт отрабатывает правильно ?
open('test.txt', 'w').write('12345')
print open('test.txt', 'r').read()
Офлайн
Андрей СветловПопробую ответить цитатой из Лутца
А на каком основании закрывать именно после создания списка?
Кстати, в 3.2 незакрытый файл — это ResourceWarning
Вызов метода close является необязательным
Вызов метода close разрывает связь с внешним файлом. Как
рассказывалось в главе 6, интерпретатор Python немедленно освобождает память,
занятую объектом, как только в программе будет утеряна последняя ссылка
на этот объект. Как только объект файла освобождается, интерпретатор
автоматически закрывает ассоциированный с ним файл (что происходит
также в момент завершения программы). Благодаря этому вам не требу-
ется закрывать файл вручную, особенно в небольших сценариях, которые
выполняются непродолжительное время. С другой стороны, вызов метода
close не повредит, и его рекомендуется использовать в крупных системах.
Строго говоря, возможность автоматического закрытия файлов не
является частью спецификации языка, и с течением времени такое поведение
может измениться. Следовательно, привычку вызывать метод close вручную
можно только приветствовать.
Офлайн
> Я сделал вот как: я открываю свой файл и создаю новый. Читаю строку и сразу же записываю в буферный файл. Когда я нахожу нужную строку я записываю новую строку, а потом до записываю файл. Потом удаляю исходный файл, а буферный файл переименовываю
Так и быть держи мой вариант:
#!/usr/bin/python -O
# -*- coding: utf-8 -*-
data = open("fail","r").readlines()
data[-1] = "Вставляемая строка"
file = open("fail","w")
file.write("".join(data))
file.close()
Отредактировано (Июль 8, 2011 18:36:33)
Офлайн
Еще раз: ResourceWarning. Научитесь, наконец, использовать with statement!
Офлайн
kubloэто случайность == может и не отработать правильно
Если файл остался открытым , то почему такой скрипт отрабатывает правильно ?
Rodegastопять, сначала файл не закрываешь, а потом закрываешьdata = open("fail","r").readlines()
data[-1] = "Вставляемая строка"
file = open("fail","w")
file.write("".join(data))
file.close()
Отредактировано (Июль 9, 2011 03:31:33)
Офлайн
py.user.nextТакие тесты, думаю, уж выявят случайностьkubloэто случайность == может и не отработать правильно
Если файл остался открытым , то почему такой скрипт отрабатывает правильно ?
er = 0
fn = 'test.txt'
for i in xrange(10000):
# раскомментировать для второго теста
#fn = 'test' + str(i) + '.txt'
open(fn, 'w').write(str(i))
f = open(fn, 'r').read()
if f != str(i): er += 1
print '\rpass:', i, 'errors:', er,
while 1: pass # для винды, что бы окно терминала не закрылось
Отредактировано (Июль 9, 2011 11:15:50)
Офлайн
На CPython 2.x закрывается. На CPython 3.x — тоже.
Jython или IronPython работают иначе.
Офлайн
RodegastЯ так понимаю вы весь файл держите в памяти? А если файл большой то памяти может не хватить. Я тоже сначала сделал так, но потом отказался.
Так и быть держи мой вариант:
Код:
#!/usr/bin/python -O
# -*- coding: utf-8 -*-
data = open(“fail”,“r”).readlines()
data = “Вставляемая строка”
file = open(“fail”,“w”)
file.write(“”.join(data))
file.close()
Офлайн
> А если файл большой то памяти может не хватить
Тут всё от твоих потребностей зависит. Если собираешься обрабатывать файлы в несколько десятков мегабайт на не очень новой машине то тебе конечно придётся итерировать все строки. Если хочешь просто дописывать строки в конец а не заменять их, то это совсем по другому делается.
Офлайн