我正在尝试找到一种更有效的方法来过滤.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()
如果SSID在行中,则输出会产生错误:' as" TypeError:' in'需要字符串作为左操作数,而不是列表。"
当代替SSID'使用'如果str(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
我该如何处理这个问题?
答案 0 :(得分:2)
您可以使用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))
答案 1 :(得分:1)
一种解决方案是使用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)