zapisywanie danych do pliku

0

bry, mam dwa pytania odnośnie zapisywania danych do plików w pythonie.
opiszę dokładnie o co mi chodzi. Napisałem prosty program do robienia listy zakupów, działa na zasadzie "co chcesz zrobic? 1 - wyswietl liste... bla bla" w pętli. wszystko działa jak powinno, ale nurtują mnie dwie rzeczy odnośnie zapisywania listy do pliku. więc tak, na początku chciałem zrobić to w prosty sposób

plik = open("jakis_plik", "w")
plik.writelines(lista) 

byłem przekonany, że wstawi po każdym elemencie listy, znak nowej linii lub chociaż spację, niestety zapisuje to po prostu "element0Element1Element2...." rozwiązałem ten problem o tak:

plik = open("lista.txt", 'w')
	   for i in range(0, len(lista)):
		buff = lista[i]+"\n" #to wydaje mi się niepotrzebne
		plik.write(buff)
	   plik.close 

ale wydaje mi się, że na pewno jest jakaś funkcja żeby to zrobić ładniej

i druga sprawa właściwie to główna sprawa z jaką tu przyszedłem, otóż zapisywanie do pliku działa, ale tylko jeśli ten kod wyżej wykonam dwa razy. za pierwszym razem tylko usuwa dane z tego pliku i nic więcej później muszę wybrać jeszcze raz zapis listy do pliku żeby poprawnie zapisało listę. to też rozwiązałem, ale trochę na opak

 elif wybor =='4': #4 to zapisywanie do pliku nie wiem dlaczego w pythonie nie ma switcha...
		d = 0
		while d !=2:
			plik = open("lista.txt", 'w')
		
			for i in range(0, len(lista)):
				buff = lista[i]+"\n"
				plik.write(buff)
			d += 1
		plik.close

ale to mi wygląda idiotycznie i na pewno tak nie powinno być więc jak zrobić żeby za pierwszy obiegiem zapisywało ładnie do pliku?

0
wezowy_potwor napisał(a)

rozwiązałem ten problem o tak:
plik = open("lista.txt", 'w')
for i in range(0, len(lista)):
buff = lista[i]+"\n" #to wydaje mi się niepotrzebne
plik.write(buff)
plik.close

> ale wydaje mi się, że na pewno jest jakaś funkcja żeby to zrobić ładniej

Python to nie C ;)

```python
for element in lista:
	plik.write(element + '\n')

albo:

plik.write('\n'.join(lista))

Jeśli już musisz użyć range() to lepiej użyć xrange().
Nie musisz także podawać początku sekwencji jeśli jedziesz od zera:

for i in xrange(len(lista)):       # lub range(len(lista))
	# zrób coś z i
wezowy_potwor napisał(a)

i druga sprawa właściwie to główna sprawa z jaką tu przyszedłem, otóż zapisywanie do pliku działa, ale tylko jeśli ten kod wyżej wykonam dwa razy. za pierwszym razem tylko usuwa dane z tego pliku i nic więcej później muszę wybrać jeszcze raz zapis listy do pliku żeby poprawnie zapisało listę.

Coś naknociłeś. Musiałbyś gdzieś wystawić cały kod, bo na tych listingach wszystko wygląda OK.

wezowy_potwor napisał(a)

elif wybor =='4': #4 to zapisywanie do pliku nie wiem dlaczego w pythonie nie ma switcha...

Bo w Pythonie używa się do tego innych konstrukcji :)

0

dzięki za odpowiedź i za rady, a co do drugiej sprawy to ja może wkleję kod tylko powycinam nic nie znaczące w tym przypadku elif

 
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#nazwa pliku: python.py

lista = []
wybor = '111'
while wybor !='0':
	wybor = raw_input ('''co chcesz zrobic? \n1 - wyswietl liste zakupow\n2 - dodaj pozycje do listy zakupow\n3 - usun pozycje z listy zakupow\n4 - zapisz liste zakupow do pliku\n0 - wyjscie\n''')


	elif wybor =='4':
		d = 0
		while d !=2:
			plik = open("lista.txt", 'w')
		
			for i in range(0, len(lista)):
				buff = lista[i]+"\n"
				plik.write(buff)
			d += 1
		plik.close
		
print 'bye'

tak jest teraz i działa, a tak było wcześniej i trzeba było dwukrotnie wybierać zapisywanie listy do pliku


	elif wybor =='4':
		plik = open("lista.txt", 'w')
		
		for i in range(0, len(lista)):
			buff = lista[i]+"\n"
			plik.write(buff)
		plik.close
		
 

wiem, że z tym for'em tu też sknociłem , ale nie będę już poprawiał

0

A jesteś pewien, że gdzieś indziej w kodzie sobie tego pliku nie nadpisujesz?
Nawet wykorzystując Twój mało elegancki kod:

arr = ['Wiersz nr 1', 'Wiersz nr 2', 'Wiersz nr 3']
fh = open('test.dat', 'w')
for i in xrange(0, len(arr)):
        fh.write(arr[i] + '\n')
fh.close()

Wynik:

beorn@nika /tmp $ python test.py                                                                                                                                                   
beorn@nika /tmp $ cat test.dat 
Wiersz nr 1
Wiersz nr 2
Wiersz nr 3
beorn@nika /tmp $

Zatem działa. Zrób u siebie test wycinka tego kodu. Jeśli test zadziała, to znaczy że gdzieś indziej niszczysz zawartość pliku.

BTW, plik.close(), nie plik.close.

0

W tym jest chyba przyczyna, plik.close nie jest błędne, ale nie zamyka pliku.

0

eh, faktycznie, a już pisałem posta, że kod kumashiro działa, a mój nie, a robiłem już tak samo jak on, ale nie zwróciłem uwagi na plik.close() teraz śmiga, dzięki :)

0

Zachowanie jest dosyć zagadkowe:

plik=open("test.txt",'w')
plik.write("jasna\n")
plik.close #plik jest pusty
plik=open("test.txt",'w') #plik jest pusty
plik.write("doopa\n") #plik jest pusty
plik.close #w pliku jest "jasna"
plik.close() #w pliku jest "doopa"  
0
bo napisał(a)

Zachowanie jest dosyć zagadkowe:

Pewnie buforowanie wpadło w konsternację. Jak dasz plik.flush() po pierwszym plik.write(), to zachowuje się bardziej racjonalnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1