Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2014 13:29:24

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Некорректно записывает в файл

Доброго времени суток!

Подскажите пожалуйста в чем может быть ошибка.

Есть файл my_file.txt с текстом, например:

Bravely bold Sir Robin rode forth from Camelot
Yes, brave Sir Robin turned about
He was not afraid to die, O brave Sir Robin
And gallantly he chickened out
He was not at all afraid to be killed in nasty ways
Bravely talking to his feet
Brave, brave, brave, brave Sir Robin
He beat a very brave retreat

Алгоритм должен записать в отдельный файл нечетные строки

j=0
f=open('my_file.txt','r')
xlist=f.readlines()
f.close
f=open('my_file2.txt','w')
f.close
for i in xlist:
    if j%2==1:
        f=open('my_file2.txt','a')
        f.writelines(str(j)+xlist[j])
        f.close
    j+=1    
Ответ получается такой, т.е. не хватает последней строчки:

1Yes, brave Sir Robin turned about
3And gallantly he chickened out
5Bravely talking to his feet


После выполнения команды, файл невозможно удалить или изменить, т.е. он используется Питоном(но каким образом? я ведь везде закрываю его)

Если переименовать файл записи(my_file2 в my_file3 например) и выполнить команду, то предыдущий файл(my_file2) записывается корректно(хотя к нему обращения то в этот раз и не было), все 4 строчки, его можно удалить или изменить. А новый файл(my_file3) создается с такой же проблемой - нельзя изменить и выводятся 3 строки.

Где подвох?

Отредактировано EvgenKlim (Май 12, 2014 14:03:38)

Офлайн

#2 Май 12, 2014 14:06:21

yastreboff
Зарегистрирован: 2014-05-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Некорректно записывает в файл

Простите, а вы зачем в цикле

for i in xlist:
    if j%2==1:
        f=open('my_file2.txt','a')
        f.writelines(str(j)+xlist[j])
        f.close
    j+=1
каждый раз открываете и закрываете файл? Если у вас в xlist будет 1000 строк, вы 1000 раз открываете, записываете и закрываете?

Может лучше так?
j=0
f1=open('my_file.txt','r')
xlist=f1.readlines()
f1.close
f2=open('my_file2.txt','a')
for i in xlist:
    if j%2==1:
        f2.writelines(str(j)+xlist[j])
    j+=1
f2.close

Или даже так?
j=0
with open("my_file.txt", "r") as f1:
	xlist=f1.readlines()
with open("my_file2.txt", "a") as f2:
	for i in xlist:
		if j%2==1:
			f2.writelines(str(j)+xlist[j])
		j+=1

П.С. Где-то мог ошибится, проверить сейчас нет возможности. Но, в принципе, мои мысли понятны.

Отредактировано yastreboff (Май 12, 2014 14:09:40)

Офлайн

#3 Май 12, 2014 14:17:26

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Некорректно записывает в файл

Для чтения файла лучше всего использовать конструкцию with:

with open('my_file.txt', 'r') as f:
 lines = f.readlines()
print lines

Для получения четных или нечетных элементов в list можно использовать slice:
>>> a = range(1, 11)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[::2]
[1, 3, 5, 7, 9]
>>> a[1::2]
[2, 4, 6, 8, 10]
>>>

То есть, ваш код можно упростить до:
with open('my_file.txt', 'r') as f:
	lines = f.readlines()
	
with open('my_file2.txt', 'w') as f:
	f.write(''.join(lines[::2]))

Офлайн

#4 Май 12, 2014 14:26:55

yastreboff
Зарегистрирован: 2014-05-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Некорректно записывает в файл

GreyZmeem, красиво

Офлайн

#5 Май 12, 2014 14:48:50

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Некорректно записывает в файл

Вообще, пропущены скобки у close(), а функциональный аналог такой:

from itertools import islice
with open('my_file.txt','r') as f:
    xlist=f.readlines()
for n, l in islice(enumerate(xlist), 1, None, 2):
    with open('my_file2.txt','a') as f:
        f.writelines(str(n)+l)

Офлайн

#6 Май 12, 2014 15:26:49

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

Некорректно записывает в файл

#!/usr/bin/env python3
 
ifname = '/etc/passwd'
ofname = 'out.txt'
 
with open(ifname, encoding='utf-8') as fin, \
     open(ofname, 'w', encoding='utf-8') as fout:
    for i, s in enumerate(fin):
        if i % 2 == 1:
            fout.write('{} {}'.format(i, s))



Офлайн

#7 Май 13, 2014 05:44:37

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Некорректно записывает в файл

Спасибо всем за помощь!!!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version