Неправильный логический результат в основной программе (python) - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь написать этот простой код на Python: если второй элемент строки файла csv содержит одно из семейств, указанных в списке «malware_list», основная программа должна вывести «true». Однако в результате программа всегда печатает «ЛОЖЬ».

Каждая строка в файле имеет вид: "NAME, СЕМЬЯ"

Это код:

malware_list = ["FakeInstaller","DroidKungFu", "Plankton",
            "Opfake", "GingerMaster", "BaseBridge",
            "Iconosys", "Kmin", "FakeDoc", "Geinimi",
            "Adrd", "DroidDream", "LinuxLotoor", "GoldDream"
            "MobileTx", "FakeRun", "SendPay", "Gappusin",
            "Imlog", "SMSreg"]

def is_malware (line):
    line_splitted = line.split(",")
    family = line_splitted[1]
    if family in malware_list:
        return True
    return False

def main():
    with open("datset_small.csv", "r") as f:
        for i in range(1,100):
            line = f.readline()
            print(is_malware(line))

if __name__ == "__main__": 
    main()

Ответы [ 4 ]

0 голосов
/ 29 октября 2018

Я бы поставил вместо списка скорость, и, безусловно, Pandas лучше из-за скорости и легкости кода. Вы можете использовать x в y логике, чтобы получить результаты;)

import io #not needed in your case
import pandas as pd

data = io.StringIO('''090b5be26bcc4df6186124c2b47831eb96761fcf61282d63e13fa235a20c7539,Plankton 
bedf51a5732d94c173bcd8ed918333954f5a78307c2a2f064b97b43278330f54,DroidKungFu 
149bde78b32be3c4c25379dd6c3310ce08eaf58804067a9870cfe7b4f51e62fe,Plankton''')

df = pd.read_csv(data,sep=',',header=None)
malware_set = ("FakeInstaller","DroidKungFu", "Plankton",
            "Opfake", "GingerMaster", "BaseBridge",
            "Iconosys", "Kmin", "FakeDoc", "Geinimi",
            "Adrd", "DroidDream", "LinuxLotoor", "GoldDream"
            "MobileTx", "FakeRun", "SendPay", "Gappusin",
            "Imlog", "SMSreg")



df.columns = ['id','software']

df['malware'] = df['software'].apply(lambda x: x.strip() in malware_set)

print(df)
0 голосов
/ 29 октября 2018

python имеет пакет под названием pandas. Используя панды, мы можем прочитать CSV-файл в формате данных.

import pandas as pd df=pd.read_csv("datset_small.csv")

Пожалуйста, опубликуйте свой контент в CSV-файле, чтобы я мог помочь вам

0 голосов
/ 29 октября 2018

Это может быть легко достигнуто с помощью фрейма данных. Пример кода выглядит следующим образом

import pandas as pd

malware_list = ["FakeInstaller","DroidKungFu", "Plankton",
            "Opfake", "GingerMaster", "BaseBridge",
            "Iconosys", "Kmin", "FakeDoc", "Geinimi",
            "Adrd", "DroidDream", "LinuxLotoor", "GoldDream"
            "MobileTx", "FakeRun", "SendPay", "Gappusin",
            "Imlog", "SMSreg"]
# read csv into dataframe
df = pd.read_csv('datset_small.csv')
print(df['FAMILY'].isin(malware_list))

вывод

0    True
1    True
2    True

образец CSV используется

NAME,FAMILY
090b5be26bcc4df6186124c2b47831eb96761fcf61282d63e13fa235a20c7539,Plankton
bedf51a5732d94c173bcd8ed918333954f5a78307c2a2f064b97b43278330f54,DroidKungFu
149bde78b32be3c4c25379dd6c3310ce08eaf58804067a9870cfe7b4f51e62fe,Plankton
0 голосов
/ 29 октября 2018
line = f.readline()

readline не удаляет завершающий перевод строки из результата, поэтому, скорее всего, line здесь выглядит примерно как "STEVE,FakeDoc\n". Тогда family становится "FakeDoc\n", который не является членом malware_list, поэтому ваша функция возвращает False.

Попробуйте удалить пробел после прочтения:

line = f.readline().strip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...