【问题标题】:for loop through a set list of strings in Python to create a filterfor 循环遍历 Python 中的一组字符串以创建过滤器
【发布时间】:2016-04-12 17:04:46
【问题描述】:

我正在尝试找到一种更有效的方法来过滤 .csv 文件中的 SSID 列表,然后将过滤后的结果写入另一个文件。

目前,我的代码如下所示(并且按预期工作):

def ssidFilter():

    File = open("/home/pi/unFilter.csv", "r")
    for line in File:
        if 'Test SSID' in line:
            with open("/home/pi/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))
        if 'Public' in line:
            with open("/home/pi/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))
        if 'HomeNet' in line:
            with open("/home/pi/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))
        if 'Network 1' in line:
            with open("/home/pi/gpsMaster/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))
        if 'LimeOak' in line:
            with open("/home/pi/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))
        if 'BlackCrow' in line:
            with open("/home/pi/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))
        if 'GuestWiFi' in line:
            with open("/home/pi/dataLog.csv", "a") as finalFile:
                            finalFile.write(str(line))                                
    File.close()

但是,我想使用不单独运行每个 SSID 的解决方案。我想使用一个列表并遍历它。今天早上我问了一个关于 zip 功能的问题,但无法让它与这部分代码一起工作。

我一直在使用的东西(没有工作):

SSID = ['Test SSID' , 'Public' , '....etc...']
File = open("/home/pi/unFilter/csv" , "r")
for line in File:
    if SSID in line:
        with open("/home/pi/dataLog.csv", "a") as finalFile:
            finalFile.write(str(line))
File.close()                               

此输出在 'if SSID in line:' 处产生错误,因为“TypeError: 'in ' 需要字符串作为左操作数,而不是列表。”

当用“if str(SSID)”替换“if SSID”时,我没有收到任何错误,但也没有任何返回,我猜这是因为它搜索的是整个字符串而不是单个元素。

我有同样的 TypeError,除了它把它当作一个元组而不是一个列表,当我尝试使用 zip 时,如果我使用正确的话..

File = open('/home/pi/unFilter.csv', 'r')
for line in File:
    for new in zip(SSID):
        if new in line:
            print line

我应该如何处理这个问题?

【问题讨论】:

    标签: python python-2.7 for-loop


    【解决方案1】:

    您可以使用any 来遍历关键字

    SSID = ['Test SSID' , 'Public' , '....etc...']
    with open('/home/pi/unFilter.csv', 'r') as in_file:
        for line in infile:
            if any(item in line for item in SSID):
                with open("/home/pi/dataLog.csv", "a") as finalFile:
                    finalFile.write(str(line))
    

    【讨论】:

      【解决方案2】:

      一种解决方案是使用any(如另一个答案中所述),但以防万一,您可以解析 从您的行中获取 SSID 的名称,您可以使用更有效的解决方案来测试成员资格 在感兴趣的名称列表中找到 SSID 名称。

      以下代码使用get_ssid 函数,该函数尝试从行中获取 SSID 名称。

      有了 SSID 名称,测试更加简单快捷。

      def ssidFilter(ssids_to_log, input_csv, output_csv):
          def get_ssid(line):
              # parse SSID from the line, return it
              # Here I assume it is first part of the line, delimited by ;
              return line.split(";", 1)[0]
      
          with open(input_csv) as in_f:
              with open(output_csv, "a") as out_f:
                  for line in in_f:
                      if get_ssid(line) in ssids_to_log:
                          out_f.write(str(line))
      
      if __name__ == "__main__":
          ssids_to_log = ["Test SSID", "Public", "HomeNet", "Network 1",
                          "LimeOak", "BlackCrow", "GuestWiFi"]
          input_csv = "/home/pi/unFilter.csv"
          output_csv = "/home/pi/dataLog.csv"
          ssidFilter(ssids_to_log, input_csv, output_csv)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 2017-04-13
        • 2015-04-22
        • 2023-03-23
        相关资源
        最近更新 更多