zapisywanie danych do pliku

Odpowiedz Nowy wątek
2011-07-28 18:45
wezowy_potwor
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?

Pozostało 580 znaków

2011-07-28 22:21
Kumashiro
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 ;)

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 :)

Pozostało 580 znaków

2011-07-29 12:51
wezowy_potwor
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ł

Pozostało 580 znaków

2011-07-29 13:07
Kumashiro
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:

[email protected] /tmp $ python test.py                                                                                                                                                   
[email protected] /tmp $ cat test.dat 
Wiersz nr 1
Wiersz nr 2
Wiersz nr 3
[email protected] /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.

Pozostało 580 znaków

2011-07-29 13:24
bo
0

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

Pozostało 580 znaków

2011-07-29 13:36
wezowy_potwor
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 :)

Pozostało 580 znaków

2011-07-29 13:43
bo
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"  

Pozostało 580 znaków

2011-07-29 14:12
Kumashiro
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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