I ett annat inlägg ställer användaren Rullandegalning en fråga om hur man i Python hämtar en extern fil och använder den som en uppslagsbok. Eftersom forumsdelen är i dvala 364 dagar om året kan vi lika gärna reda ut vad han vill och hur man kan göra det.
I ursprunglig tråd inkommer Rullandegalning med följande AI-genererad kod:
Ur koden kan vi utläsa att han har låtit AI generera ett shifferskript som ska knäcka ett skiffer med en extern ordlista. I koden finner vi följande mock-kod:
Frågan han ställer är hur han får in en ordlista i sitt skript när han befinner sig på sin Ipad.
För att lösa detta problem behöver han veta två saker:
1. uppslagsverk eller dictionaries har två betydelser i Python. Båda betydelserna används dessutom i den AI-genererade koden. Ett uppslagsverk är kodmässigt objektet Dict
2. För att hämta en fil i ditt script behöver du känna till modulen "os" och "sys". Båda använder ditt operativsystems konfiguration för att finna specifika kommandon för just ditt system. Det enklaste du kan göra är att låta Python själv bestämma den relativa adressen till din ordbok, eller använda den absoluta adressen som du manuellt matar in när du kör ditt skript.
3. De flesta pythonprogram körs genom CLI och startas med python [programfil.py] eller python3 [programfil.py] eller python -m [programfil.py]. Vi kommer att använda de två föregående beroende på ditt OS. När jag vill köra mitt skript vill jag också mata in den ordfil som jag använder som ordlista, vilket jag gör med python programfil.py ordlista.txt.
Vi kommer använda "sys" och vi skapar ett litet skript som kommer att printa ut argumenten vi använder när vi öppnar programmet:
Redultatet blir:
Vill jag ha med min ordlista eller en adress till min ordlista;
Okej! Nu vet vi hur vi hämtar filnamnet och eventuellt hela adressen till filen, bra! Hur använder vi nu den?
Ja, processen här beror ju på hur din ordlista är utformad, är det ord som är i flytande text, eller är det ord som är uppradade?
Till att börja med ser hans ursprungliga kod ut så här:
Om vi skapar en fil med frukter:
Vi kör vårt lilla skript som det är nu:
Ser man på, vi får min ordlista i en lista. Vi har således använt en extern fil i vårt skript.
Dock är inte listkomprimeringen särskilt strålande, då "f" är en IOWrapper som hänger. Vi vet inte vad den kommer att göra. Nu hade vi tur att den läste av varje ord i ordlistan, den kunde lika gärna ha läst av varje bokstav.
Är man inte säker på var man har sin ordlista får man använda modulen "os" och "os.path" för att hitta adressen till sin lista. Men det är en annan tråd.
För övrigt är AI-gnererad python rätt klumpig att använda.
För folk som inte förstår akademisk diskussion:
Hur kan vi mer hjälpa killen med sitt skript?
Hur kan kille lära sig att t.ex. skriva om den där for-loopen som lika gärna kan vara i With-containern.
Varför ska man inte köra IOWrapper helt utan uppgift?
(Vhe kan hålla sig borta från python så länge).
I ursprunglig tråd inkommer Rullandegalning med följande AI-genererad kod:
Kod:
import string import itertools def vigenere_decrypt(ciphertext, key): decrypted = [] key = key.upper() key_length = len(key) for i, char in enumerate(ciphertext): if char in string.ascii_uppercase: decrypted.append(chr((ord(char) - ord(key[i % key_length]) + 26) % 26 + ord('A'))) else: decrypted.append(char) return ''.join(decrypted) # Load the list of English words with open("path/to/your/dictionary.txt") as f: words = [word.strip().upper() for word in f if word.strip().isalpha()] ciphertext = "OBKRUOXOGHULBSOLIFBBWFLRVQQPRNGKSSOTWTQSJQSSEKZZWATJKLUDIAWINFBNYPVTTMZFPKWGDKZXTJCDIGKUHUAUEKCAR" results = {} for word in words: decrypted_message = vigenere_decrypt(ciphertext, word) if " " in decrypted_message: # simple heuristic to check for valid English text results[word] = decrypted_message print(f"Key: {word}\nDecrypted Message: {decrypted_message}\n") break # Stop once a valid message is found
Ur koden kan vi utläsa att han har låtit AI generera ett shifferskript som ska knäcka ett skiffer med en extern ordlista. I koden finner vi följande mock-kod:
Kod:
# Load the list of English words
with open("path/to/your/dictionary.txt") as f:
words = [word.strip().upper() for word in f if word.strip().isalpha()]
Frågan han ställer är hur han får in en ordlista i sitt skript när han befinner sig på sin Ipad.
För att lösa detta problem behöver han veta två saker:
1. uppslagsverk eller dictionaries har två betydelser i Python. Båda betydelserna används dessutom i den AI-genererade koden. Ett uppslagsverk är kodmässigt objektet Dict
Kod:
Men det kan också vara ett uppslagsverk, dvs en ordbok som en fil.
a =dict({"a":"apa"}
Out[7]: {'a': 'apa'}
type(a)
Out[8]: dict
2. För att hämta en fil i ditt script behöver du känna till modulen "os" och "sys". Båda använder ditt operativsystems konfiguration för att finna specifika kommandon för just ditt system. Det enklaste du kan göra är att låta Python själv bestämma den relativa adressen till din ordbok, eller använda den absoluta adressen som du manuellt matar in när du kör ditt skript.
3. De flesta pythonprogram körs genom CLI och startas med python [programfil.py] eller python3 [programfil.py] eller python -m [programfil.py]. Vi kommer att använda de två föregående beroende på ditt OS. När jag vill köra mitt skript vill jag också mata in den ordfil som jag använder som ordlista, vilket jag gör med python programfil.py ordlista.txt.
Vi kommer använda "sys" och vi skapar ett litet skript som kommer att printa ut argumenten vi använder när vi öppnar programmet:
Kod:
import sys
#sys.argv är platsen där argumenten ligger. Den returnerar en lista med dina argument.
wrd_list =sys.argv
print(wrd_list)
Redultatet blir:
Kod:
python3 tmp.py ['tmp.py']
Vill jag ha med min ordlista eller en adress till min ordlista;
Kod:
python3 tmp.py ordlista.txt ['tmp.py', 'ordlista.txt']
Kod:
python3 tmp.py c:\ordlista.txt ['tmp.py', 'c:\ordlista.txt']
Okej! Nu vet vi hur vi hämtar filnamnet och eventuellt hela adressen till filen, bra! Hur använder vi nu den?
Ja, processen här beror ju på hur din ordlista är utformad, är det ord som är i flytande text, eller är det ord som är uppradade?
Till att börja med ser hans ursprungliga kod ut så här:
Kod:
Vi behåller den så länge och modifierar det vi har lärt oss.
with open("path/to/your/dictionary.txt") as f:
words = [word.strip().upper() for word in f if word.strip().isalpha()]
Kod:
import sys
#Eftersom sys.argv returnerar en lista på allt som är efter "python" måste jag välja element i listan
#Jag vet att element på plats 1 är min ordlista.
#Jag hämtar då element 1 genom sys.argv[1]
file_name =sys.argv[1]
# Nu har jag ersatt "path/to/your/dictionary.txt" med file_name
# Den kan vara ett filnamn eller en absolut adress.
with open(file_name, 'r') as f:
words = [word.strip().upper() for word in f if word.strip().isalpha()]
Om vi skapar en fil med frukter:
Kod:
cat frukt.txt äpple banan päron
Vi kör vårt lilla skript som det är nu:
Kod:
python3 tmp.py frukt.txt ['ÄPPLE', 'BANAN', 'PÄRON']
Ser man på, vi får min ordlista i en lista. Vi har således använt en extern fil i vårt skript.
Dock är inte listkomprimeringen särskilt strålande, då "f" är en IOWrapper som hänger. Vi vet inte vad den kommer att göra. Nu hade vi tur att den läste av varje ord i ordlistan, den kunde lika gärna ha läst av varje bokstav.
Är man inte säker på var man har sin ordlista får man använda modulen "os" och "os.path" för att hitta adressen till sin lista. Men det är en annan tråd.
För övrigt är AI-gnererad python rätt klumpig att använda.
För folk som inte förstår akademisk diskussion:
Hur kan vi mer hjälpa killen med sitt skript?
Hur kan kille lära sig att t.ex. skriva om den där for-loopen som lika gärna kan vara i With-containern.
Varför ska man inte köra IOWrapper helt utan uppgift?
(Vhe kan hålla sig borta från python så länge).
__________________
Senast redigerad av Methos 2024-06-15 kl. 15:43.
Senast redigerad av Methos 2024-06-15 kl. 15:43.