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

question-closed Formatowanie pliku txt w python - gra hangman

Object Storage Arubacloud
+1 głos
815 wizyt
pytanie zadane 19 czerwca 2019 w Python przez Ventre90 Obywatel (1,170 p.)
zamknięte 25 czerwca 2019 przez Ventre90

Cześć drodzy pasjonaci. Znów zwracam sie do Was z pytaniem. czy istnieje możliwość bardziej optymalnego formatowania pliku txt (żeby finalnie stał się on listą). Napisałem grę wisielec. Na początku słowo,które trzeba zgadnąć wpisywałem jako wartość funkcji, potem stworzyłem jakąś krótka listę. Dalej rozwijając ten program zrobiłem większą"baze" słów w pliku txt. Dane kopiowałem z jakiejś strony więc format nie jest idealny. Nie formatowałem tego jednak ręcznie bo wpadłem na pomysł, żeby zrobić to w pythonie. Plik txt wygląda tak: 

tydzien=897 sytuacja=892 wczoraj=892 pieniadz=891 niebo=885 morze=880 takze=878  wazny=872 tworzyc=869  tam=861 material=861
mleko=821 system=820 glos=819 silny=817 pisac=810 slonce=809 poczatek=809 pic=807 znac=806 serce=806 tysiac=801 poludniowy=800 wiatr=800 wyraz=799 obraz=798 drzwi=798
wszystkie=588 2=586 uczucie=586 zachodni=585 chlopiec=585 spac=585 cena=584 program=584 komputer=583 calosc=582 5=580  elektryczny=578 polityczny=578 pojazd=577
dziedzina=569 ludzki=567 zloty=566 przyjsc=566 spoleczny=565 dokument=564 niebieski=563 wiedza=561 przypadek=559 herbata=558 trzeba=557 list=556 okolo=556

1. Moim celem było pozostawienie tylko wyrazów w formie listy jako bazy danych slow do gry wisielec. Próbowałem to zrobić w pętli ale miałem błąd, że int nie może być iterowany. Także jak już  udało mi się stworzyć listę z tego pliku to dowiedziałem się, że w liście nie działa metoda 'replace', dlatego wszystko formatowałem jeszcze przed zamianą do listy. Finalnie wygląda to tak ale mam wątpliwości czy to jest optymalne rozwiązanie.

2. Jeszcze mam do Was takie pytanie. Jak wyznaczy ścieżkę do zapisu i odczytu pliku w pythonie. Niestety obecnie python zapisuje i odczytuje pliki tylko w katalogu domyślnym ( chyba tam gdzie jest zainstalowany). Zwraca mi błąd, że plik nie istnieje lub nie może go odnaleźć nawet wtedy gdy program i plik txt jest w tym samym folderze. Jak narzazie wszystko robię  w tym katalogu domyślnym ale to nie jest zbyt komfortowe.

import random
f = open("HMbase.txt","r")
value = f.read()
value = value.replace("=","")
value = value.replace("1","")
value = value.replace("2","")
value = value.replace("3","")
value = value.replace("4","")
value = value.replace("5","")
value = value.replace("6","")
value = value.replace("7","")
value = value.replace("8","")
value = value.replace("9","")
value = value.replace("0","")
value = value.strip()
value = value.split()
f.close()

num = random.randint(0,len(value)-1)
spell = value[num]

def hangman(word):
    wrong = 0
    stage = ["",
             "________        ",
             "|               ",
             "|        |      ",
             "|        0      ",
             "|       /|\     ",
             "|       / \     ",
             "|               "
              ]
    board = ["__"] * len(word)
    letter = list(word)
    win = False
    print(".::. HANGMAN GAME .::.")

    while wrong < len(stage) - 1:
        print("\n")
        msg = "Enter the letter: "
        char = input(msg)

        if char in letter:
            place = letter.index(char)
            board[place] = char
            letter[place] = "#"
        else:
            wrong += 1
        r = wrong + 1
        print (" ".join(board))
        print ("\n".join(stage[0:r]))

        if "__" not in board:
            print("\nYOU WIN !!!")
            print(" ".join(board))
            win = True
            break
    if not win:
        print("\nGAME OVER")
        print("You should spell: '{}'".format(word))

hangman(spell)

 

komentarz zamknięcia: Temat rozwiązany

2 odpowiedzi

+2 głosów
odpowiedź 19 czerwca 2019 przez mokrowski Mędrzec (155,460 p.)
wybrane 25 czerwca 2019 przez Ventre90
 
Najlepsza

Proponuję zbudować sensowną bazę słów.

1. Do obsługi plików stosuj zarządcę kontekstu (with...). Otwiera on plik na wstępie a po zakończeniu bloku kodu, zamyka go poprawnie.

2. Do podziału danych na granicy spacji użyj split()... a tak się składa że może on przyjąć także i znak na którym dzieli. Drugim znakiem jest '=', więc zrobisz to 2 razy.

3. Interesować będzie Cię co 2-gie pole, stąd wystarczy tylko 1 z pary.

Razem to może wyglądać tak:

words = []
with open('/tmp/file.txt', 'r') as inFile: 
    for line in inFile: 
        words.extend([word.split('=')[0] for word in line.split()])

https://docs.python.org/3/reference/compound_stmts.html#the-with-statement

https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

PS. Masz 2 błędy w danych. Po słowie "całosc" masz zapis "5=580" oraz po "wszystkie" masz "2=586". Daje Ci to "słowa" 2 i 5. One średnio nadają się do gry :-)

komentarz 24 czerwca 2019 przez Ventre90 Obywatel (1,170 p.)

Cześć mokrowski, dzięki za pomoc i przepraszam za późną odp. ale nie miałem dostępu do komputera przez parę dni. Przeczytałem dokumentacje ale niestety wszystko nie jest dla mnie jasne.

Możesz mi bardziej wyjaśnić co robi twój kod dokładnie od momentu: 

for line in inFile:

        words.extend([word.split('=')[0] for word in line.split()])

Ja to tak rozumiem, że najpierw jest pętla główna wypisująca każdą linie w pliku txt.

Potem extend - czyli tworzy liste. // pierwszy split usuwa znak '=' i tworzy liste z wyrazów i "tych pozostałości - liczb".

Właściwie potem już nie wiem co się dzieje, do czego służy [0]. 2-ga pętla dotyczy zesplitowanych słów w lini txt ale co sprawia, że po zakończeniu sekwencji jak dam print(words) to w liscie są tylko same słowa bez 'liczb' . Innymi słowy co się zadziało, że wyświetla co 2gi wyraz?

PS.

Czy po formule with open (file) as f : nie trzeba juz używać żadnej funkcji close ? W dokumentacji nie ma nic o tym powiedziane i wole się dopytać.

komentarz 24 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Innymi słowy co się zadziało, że wyświetla co 2gi wyraz?

Pythona dość łatwo tłumaczy się na pseudo-polski:

words.extend([word.split('=')[0] for word in line.split()])

Rozszerz listę słów o (dla każdego słowa linii, podziel to słowo po znaku równości i daj mi pierwszą część).

Czy po formule with open (file) as f : nie trzeba juz używać żadnej funkcji close ?

Dokładnie po to jest `with`: automatycznego sprzątania zasobów.

komentarz 24 czerwca 2019 przez mokrowski Mędrzec (155,460 p.)

@Ventre90, no to wersja uproszczona z informacjami co i gdzie się dzieje. Choć jak mówiłem, stosuj raczej with oraz generatorową postać listy:

#!/usr/bin/env python3

words_file = open('/tmp/data.txt', 'r')
my_words = []

for line in words_file:
    # Podział na znakach białych
    words = line.split()
    # Podział na znakach '=' każdego wyrażenia
    for word in words:
        word_and_value = word.split('=')
        # Jeśli chcesz, odkomentuj linię poniżej
        # aby zobaczyć co jest w word_and_value
        #print(word_and_value)
        # Tylko pierwsze słowo jest interesujące
        my_words.append(word_and_value[0])

words_file.close()

 

komentarz 25 czerwca 2019 przez Ventre90 Obywatel (1,170 p.)

@mokrowski - bardzo dziękuję za zaangażowanie i poświęcony czas. Twój niewątpliwy talent dydaktyczny sprawia, że w temacie nie zostają żadne wątpliwości. Rozwiązanie oczywiście działa ale ważniejsze jest to, że zrozumiałem istotę problemuyes

Pozdrawiam i zamykam temat.

+2 głosów
odpowiedź 19 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Moim celem było pozostawienie tylko wyrazów w formie listy jako bazy danych slow do gry wisielec

Jeśli to prosty ciąg słów bez polskich znaków, jak pokazałeś, to wystarczy prosty regex:

>>> re.findall('[a-z]+', 'abc=123 d=7 e=8\nc=9')
['abc', 'd', 'e', 'c']

Niestety obecnie python zapisuje i odczytuje pliki tylko w katalogu domyślnym ( chyba tam gdzie jest zainstalowany

Ścieżki względne są względem lokalizacji, z której odpalony został skrypt. Jeśli odpalasz go z konsoli, to jest to katalog w którym jesteś w konsolu.

Jak wyznaczy ścieżkę do zapisu i odczytu pliku w pythonie

Możesz zawsze wpisać ścieżkę bezwzględną?

komentarz 24 czerwca 2019 przez Ventre90 Obywatel (1,170 p.)
adrian17 bardzo dziekuje za opd.

Bezwzględna ścieżka do pliku działa. Początkowo źle ją wpisywałem używając tylko \ zamiast \\.

Jeżeli chodzi o ten regex to. Ogladałem o tym troche na YT i w dokumentacji ale mój skill tego nie ogarnia. Znalazłem jakieś proste przykłady np:

import re

str = "The rain in Spain"
x = re.findall("ai", str)
print(x)

>>> ['ai', 'ai']

ale nie moge się połapać w logice tych podmian.
komentarz 24 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Początkowo źle ją wpisywałem używając tylko \ zamiast \\.

Poczytaj o raw stringach; albo przerzuć się na slash / ;)

re.findall("ai", str)

To mówi "znajdź mi wszystkie ciągi znaków które mają: ai". Mój regex mówił: "znajdź mi wszystkie ciągi znaków które mają: dowolną liczbę znaków od a do z". Jak nie masz z nimi doświadczenia to może faktycznie rozwiązanie mokrowskiego będzie lepsze.

komentarz 25 czerwca 2019 przez Ventre90 Obywatel (1,170 p.)

@adrian17 - masz racje nie mam z regexami żadnego doświadczenia. Na pierwszy rzut oka ta funkcja ma bardzo duży potencjał i chciałbym się także i tego nauczyć, jednak muszę puki co, pozostać przy bardziej podstawowej kolejności nauczania. Zagadnień jest ogrom ;)

Na razie nie będę Cie bardziej o to męczył, jednak w przyszłości, będę wiedział do kogo zwrócić się w tym temacie.

Pozdrawiam!

Podobne pytania

+1 głos
0 odpowiedzi 316 wizyt
pytanie zadane 27 lipca 2021 w Python przez Mocaz Użytkownik (560 p.)
0 głosów
1 odpowiedź 465 wizyt
pytanie zadane 15 grudnia 2020 w Python przez Pico Obywatel (1,330 p.)
0 głosów
2 odpowiedzi 3,702 wizyt
pytanie zadane 31 marca 2017 w Python przez ignacjusz Bywalec (2,390 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...