Уведомления

Группа в Telegram: @pythonsu

#1 Июль 8, 2011 15:19:49

kublo
От:
Зарегистрирован: 2011-04-08
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

Если файл остался открытым , то почему такой скрипт отрабатывает правильно ?

open('test.txt', 'w').write('12345')
print open('test.txt', 'r').read()



Офлайн

#2 Июль 8, 2011 16:02:59

kublo
От:
Зарегистрирован: 2011-04-08
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

Андрей Светлов
А на каком основании закрывать именно после создания списка?
Кстати, в 3.2 незакрытый файл — это ResourceWarning
Попробую ответить цитатой из Лутца
Вызов метода close является необязательным
Вызов метода close разрывает связь с внешним файлом. Как
рассказывалось в главе 6, интерпретатор Python немедленно освобождает память,
занятую объектом, как только в программе будет утеряна последняя ссылка
на этот объект. Как только объект файла освобождается, интерпретатор
автоматически закрывает ассоциированный с ним файл (что происходит
также в момент завершения программы). Благодаря этому вам не требу-
ется закрывать файл вручную, особенно в небольших сценариях, которые
выполняются непродолжительное время. С другой стороны, вызов метода
close не повредит, и его рекомендуется использовать в крупных системах.
Строго говоря, возможность автоматического закрытия файлов не
является частью спецификации языка, и с течением времени такое поведение
может измениться. Следовательно, привычку вызывать метод close вручную
можно только приветствовать.



Офлайн

#3 Июль 8, 2011 18:35:37

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

> Я сделал вот как: я открываю свой файл и создаю новый. Читаю строку и сразу же записываю в буферный файл. Когда я нахожу нужную строку я записываю новую строку, а потом до записываю файл. Потом удаляю исходный файл, а буферный файл переименовываю

Так и быть держи мой вариант:

#!/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)

Офлайн

#4 Июль 8, 2011 19:43:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вставка строки в текстовый файл

Еще раз: ResourceWarning. Научитесь, наконец, использовать with statement!



Офлайн

#5 Июль 9, 2011 03:29:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

kublo
Если файл остался открытым , то почему такой скрипт отрабатывает правильно ?
это случайность == может и не отработать правильно

Rodegast
data = open("fail","r").readlines()
data[-1] = "Вставляемая строка"
file = open("fail","w")
file.write("".join(data))
file.close()
опять, сначала файл не закрываешь, а потом закрываешь
надо всегда закрывать



Отредактировано (Июль 9, 2011 03:31:33)

Офлайн

#6 Июль 9, 2011 11:13:37

kublo
От:
Зарегистрирован: 2011-04-08
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

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 # для винды, что бы окно терминала не закрылось
P.S. Только не думайте что я пытаюсь доказать павильность такого стиля программирования, я просто пытаюсь доказать что в Python 2.x файлы закрываются автоматически после того как пропадает ссылка на их объекты.



Отредактировано (Июль 9, 2011 11:15:50)

Офлайн

#7 Июль 9, 2011 16:21:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вставка строки в текстовый файл

На CPython 2.x закрывается. На CPython 3.x — тоже.
Jython или IronPython работают иначе.



Офлайн

#8 Авг. 2, 2011 09:00:10

FroL
От:
Зарегистрирован: 2011-06-21
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

Rodegast
Так и быть держи мой вариант:
Код:

#!/usr/bin/python -O
# -*- coding: utf-8 -*-

data = open(“fail”,“r”).readlines()
data = “Вставляемая строка”
file = open(“fail”,“w”)
file.write(“”.join(data))
file.close()
Я так понимаю вы весь файл держите в памяти? А если файл большой то памяти может не хватить. Я тоже сначала сделал так, но потом отказался.



Офлайн

#9 Авг. 4, 2011 15:17:56

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Вставка строки в текстовый файл

> А если файл большой то памяти может не хватить

Тут всё от твоих потребностей зависит. Если собираешься обрабатывать файлы в несколько десятков мегабайт на не очень новой машине то тебе конечно придётся итерировать все строки. Если хочешь просто дописывать строки в конец а не заменять их, то это совсем по другому делается.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version