Найти - Пользователи
Полная версия: Некорректно записывает в файл
Начало » Python для новичков » Некорректно записывает в файл
1
EvgenKlim
Доброго времени суток!

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

Есть файл 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 строки.

Где подвох?
yastreboff
Простите, а вы зачем в цикле
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

П.С. Где-то мог ошибится, проверить сейчас нет возможности. Но, в принципе, мои мысли понятны.
GreyZmeem
Для чтения файла лучше всего использовать конструкцию 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]))
yastreboff
GreyZmeem, красиво
Shaman
Вообще, пропущены скобки у 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)
py.user.next
#!/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))
EvgenKlim
Спасибо всем за помощь!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB