【问题标题】:Wrong boolean result in the main program (python)主程序中的错误布尔结果(python)
【发布时间】:2018-10-29 18:00:24
【问题描述】:

我正在尝试用 Python 编写这个简单的代码:如果 csv 文件的一行的第二个元素包含“malware_list”列表中指定的系列之一,则主程序应打印“true”。但是,结果是程序总是打印“FALSE”。

文件中的每一行都采用以下格式: “姓名,家庭”

这是代码:

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()

【问题讨论】:

  • Python 有一个 csv 模块,它知道如何正确解析 CSV 文件(这比在它看到的每个逗号上简单地分割一行更复杂)。
  • csv文件的内容是什么?
  • @Daniel it's formed by lines in this form: 090b5be26bcc4df6186124c2b47831eb96761fcf61282d63e13fa235a20c7539,Plankton bedf51a5732d94c173bcd8ed918333954f5a78307c2a2f064b97b43278330f54,DroidKungFu 149bde78b32be3c4c25379dd6c3310ce08eaf58804067a9870cfe7b4f51e62fe,Plankton
  • @Pierfrancesco:编辑你的问题
  • 您知道您的输入将始终与您在恶意软件列表中使用的大写形式匹配吗?

标签: python string list csv


【解决方案1】:
line = f.readline()

readline 不会从结果中删除尾随的换行符,因此这里的 line 很可能类似于 "STEVE,FakeDoc\n"。然后family变成"FakeDoc\n",它不是malware_list的成员,所以你的函数返回False。

阅读后尝试去掉空格:

line = f.readline().strip()

【讨论】:

    【解决方案2】:

    python 有一个名为 pandas 的包。通过使用 pandas,我们可以读取数据框格式的 CSV 文件。

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

    请将您的内容以 CSV 文件形式发布,以便我为您提供帮助

    【讨论】:

    • 安装第三方库 pandas 以读取 csv 文件似乎有点过头了,因为 Python 已经预装了一个 csv 模块。不过,我确实喜欢使用 csv 解析器而不是手动提取数据的总体思路。
    【解决方案3】:

    使用数据框可以轻松实现。 示例代码如下

    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
    

    【讨论】:

      【解决方案4】:

      我会为速度设置而不是列表,并且由于代码的速度和易用性,Pandas 肯定更好。您可以在 y 逻辑中使用 x 来获取结果;)

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-22
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多