Permalänk

Python hjälp!

Hej! Är total nybörjare på programmering, läser min första kurs ever på högskola nu. Har fått i uppgift att skriva ett program för att behandla skräppost i python.

Det ska fungera så att man läser in två st .txt-filer, en med "förbjudna ord" och en "mail-fil". Programmet ska sedan läsa av hur många förbjudna ord mailet innehåller.

Min tanke är att båda text-filerna ska splittas upp ord för ord, och sedan hamna i varsin lista. Listorna jämför man sedan och letar efter gemensamma ord.

Text filen med förbjudna ord ser ut på följande sätt:

Sex
Viagra
porr
skulder

Koden för att läsa in text filen med förbjudna ord ser ut som följande:

# Filinläsning in i spam-lista
# -*- coding: cp1252 -*-

def main():
# Skapar en tom lista för förbjudna ord
spam = []
# Läser in filen med förbjudna ord
infile = open('spam.txt', 'r')

# Nu läser vi in alla ord i filen och lägger dom i en lista
line = infile.readline()
while line != '':
spam.append(line.rstrip())
line = infile.readline()
infile.close()

print spam

main()

Sedan vill jag läsa in mail-filen. Men där ligger inte orden ett på varje rad, utan man måste dela upp varje rad där det finns mellanslag och retur, dvs '\n'. Hur löser jag det problemet?

Och vad är bästa lösningen för att jämföra två listor?

Permalänk
Medlem

Re: Python hjälp!

Citat:

Ursprungligen inskrivet av plumbum88
Och vad är bästa lösningen för att jämföra två listor?

För varje ord i spam-listan finns det i mailet?

for(String s : spams){ for(String m : mail){ if(m.equalsIgnoreCase(s)) funnenaOrd.add(m); } } }

Java kod, som borde fungera.

Kanske är vettigare att ta varje mailord, och jämföra mot spamorden. Vilket som går fortast borde man kunna kartlägga.

Permalänk

För att dela upp en sträng kan man använda split.

theString.split()

split delar upp din sträng i en lista, delningen sker beroende på vilket argument du ger split. Har du inget argument gör den delningen överallt där du har whitespace (mellanslag, tabbar etc) vilket är troligtvis precis det du vill i det här fallet.

I och med att det här är en första programmeringskurs för dig så räcker det nog så, men en annan vanlig lösning är att jämföra hela strömmen med orden (reguljära uttryck gör så).

Permalänk

# Filinläsning in i mail-lista
# -*- coding: cp1252 -*-

def main():
# Skapar en tom lista för alla ord i mailet
mail = []
# Läser in filen med förbjudna ord
dok = raw_input('Ange vilket "mail" du vill öppna, mail1.txt, mail2.txt eller mail3.txt: ')
infile = open(dok, 'r')

# Nu läser vi in alla ord i filen och lägger dom i en lista
line = infile.readline()
while line != '':
mail.append(line.split())
line = infile.readline()
infile.close()

print mail

main()

-------------------------------------------

Den här koden borde fungera! Men när den i slutet skriver ut mail-listan så skrivs följande ut i IDLE:

[['Hej!'], [], ['Har', 'du', 'f\xf6r', 'h\xf6g', 'r\xe4nta?'], ['Problem', 'med', 'skulder', 'och', 'beh\xf6ver', 'skuldsanering?'], ['H\xf6g', 'inkomst', 'men', 'vill', 'slippa', 'skatt?'], [], ['Kontakta', 'oss', 'f\xf6r', 'gratis', 'r\xe5dgivning!'], ['Endast', 'seri\xf6sa', 'kunder....'], [], ['Rip-Off', 'Ekonomi', 'AB']]

Det ser liksom ut att vara flera listor? Varför finns det flera [ ], och inte bara en? Gör det någon skillnad?

Tack för hjälpen med det första inlägget!

Permalänk
Medlem

En hel fils innehåll uppdelad i en lista av ord kan man enkelt få fram med:

words = infile.read().split()

read() läser in hela filen som en enda stor sträng, och split() delar av den på whitespace, precis som ilmarinen sa.

Bästa sättet, i att det är kanske är enklast för en nybörjare, är nog att gå igenom ord för ord i mailet, och kolla om ordet är ett spamord (tips: du kan använda operatorn "in"). Om så, räkna upp med ett.
Det finns dock sätt som är lite "elegantare" (färre rader kod), men de rör nog mest till i huvudet på en nybörjare så vi lämnar dem därhän.

EDIT: Du postade innan jag hann se. Att du får listor i listor beror på att append() lägger till ett element till en lista (och det elementet du lägger till är också en lista), inte att det slår ihop två listor. Testa extend() istället.

Permalänk

Tack för hjälpen badboll och alla andra!
Extend löste problemet direkt!

Nu ska jag alltså jämföra mail-listan med spam-listan och kolla hur många liknelser det finns... Varje liknelse ska ge 4 poäng, och och "mailet" får mer än 10 poäng skrivs ** SPAM ** ut. Kan väl inte vara alltför svårt? Sedan ska också orden som gav poäng skrivas ut, så en troliga utskrivt skulle bli

** SPAM **

viagra 4p
sex 4p
porr 4p

Permalänk
Medlem

Tack så mycket, ni gjorde min dag Fick denna uppgift nyss, och tack vare er så är den klar

Visa signatur

Vincent Gustafsson

Än en dag går solen upp.