• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pobieranie i modyfikacja zawartości pliku w zależności od ilości uruchamiania programu.

Object Storage Arubacloud
0 głosów
377 wizyt
pytanie zadane 26 września 2018 w Python przez szachovy Początkujący (270 p.)

Witam,

Pracuje nad projektem, którego częścią jest w skrócie: (odebranie wartości z pliku -> modyfikacja tej wartości w pliku .py -> czyszczenie pliku z którego odebrałem wartość -> nadpisanie pliku nową zmodyfikowaną wartością). Dodam tylko, że operacje będą zachodzić tylko po ponownym uruchomieniu programu.

Poniżej jest przykład mojego problemu na wartości liczby całkowitej dodatniej, która się inkrementuje o 1 po każdym uruchomieniu programu. Po rozwianiu wątpliwości prosiłbym o dodanie komentarza w jaki sposób w takich przypadkach postępujemy z listami i innymi typami danych.

Z góry dziękuje.

def get_var_value(filename="varstore.dat"):
    with open(filename, "a+") as f:
        if f.read() == '': #jak nie ma pliku
            val = 1
            f.write(str(val)) #to zapisuje
            f.close()
            return val #i zwraca pierwsze wykonanie programu

        else: #jak plik jest
            val = int(f.read()) #to pobiera
            val += 1 #dodaje kolejne wykonanie programu

            f.seek(0) #te dwie linijki służą do czyszczenia pliku po odebraniu jego wartości tu chyba coś jest źle
            f.truncate()

            f.write(str(val)) #zapisuje
            f.close()
            return val #i zwraca ilość wykonań programu

counter = get_var_value()
print("Ilosc wykonan programu -> {}".format(counter))

 

1 odpowiedź

+2 głosów
odpowiedź 26 września 2018 przez izonik Stary wyjadacz (12,560 p.)
wybrane 26 września 2018 przez szachovy
 
Najlepsza

Więc tak główny błąd. Tryb a+ pozwala nam na dopisywanie do pliku. Nie możesz  tutaj wyczyścić pliku, a jedynie dodać do już istniejącego.

 

Jako iż mam dziś dobry dzień, napisałem ci poprawny kod wraz z komentarzami po Polsku.

def create_file(filename:str, start_value):
    # Tworzymy pusty plik
    # Zapisujemy wartość startową
    f = open(filename, "w")
    f.write(str(start_value))
    f.close()
    return start_value


def get_var_value(filename:str="varstore.dat", start_value=1):
    try:
        with open(filename, "r+") as f:
            # odczytujemy plik
            file_date = f.read()
            if file_date == "":  # kiedy plik jest PUSTY
                return create_file(filename, start_value)

            # Czyścimy plik
            f.seek(0)
            f.truncate(0)

            try:
                # Zapisujemy 
                f.write(str(int(file_date)+1))
            except ValueError:
                # Kiedy w pliku było by coś co nie jest liczbą
                # Inicjujemy go ponownie
                return create_file(filename, start_value)

            f.close()
            return int(file_date)+1
    except FileNotFoundError:
        # kiedy plik nie istnieje
        return create_file(filename, start_value)

 
counter = get_var_value()
print("Ilosc wykonan programu -> {}".format(counter))

 

 

Pozdrawiam.

 

komentarz 26 września 2018 przez mokrowski Mędrzec (155,460 p.)

Tak na pierwszy rzut oka... zarządca kontekstu with, sam wykonuje zamknięcie pliku z opróżnieniem strumienia. Nie jest potrzebne wykonywanie .close() na obiekcie otwartego pliku. Po to jest właśnie with. Dodatkowo dwa rodzaje wyjątków mają taką samą obsługę:

def get_var_value(filename:str="varstore.dat"):
    counter = 0
    try:
        with open(filename, "r+") as f:
            file_counter = f.read()
            if not file_counter:
                raise FileNotFoundError()
            else:
                counter = int(file_counter) + 1
            f.seek(0)
            f.truncate()
            f.write(str(counter))
    except (ValueError, FileNotFoundError) as e:
        with open(filename, "w") as f:
            counter += 1
            f.write(str(counter))
    return counter

if __name__ == '__main__':
    counter = get_var_value()
    print("Ilosc wykonan programu -> {}".format(counter))

 

Podobne pytania

0 głosów
0 odpowiedzi 1,718 wizyt
pytanie zadane 14 września 2020 w Python przez urbix01 Gaduła (3,290 p.)
0 głosów
1 odpowiedź 241 wizyt
0 głosów
1 odpowiedź 1,613 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...