2013-06-03 2 views
0

Я хочу сравнить строки в таблице (CSV) со списком [] с хорошими значениями и создать черный список плохих строк (любая строка, содержащая значение, которое не отображается в белом списке, печатается в файл).Python: сравнить поле в списке с полем черного списка

if any(item in row[4] for item in lisst): 
    print(rowEdit) #scaffolding 
    writer.writerow(rowEdit) 

соответствует всем к элементам в белом списке, и записывает его в файл

if any(item in row[4] for item not in lisst): 
    print(rowEdit) 
    writer.writerow(rowEdit) 

кажется, что он должен напечатать мне часть файла, не белый список, для ручного редактирования, чтобы добавить к белый список. Это не так.

Данные, которые я сортирую, представляют собой файл CSV с данными об активах. Я хочу вывести split по OS, который является элементом списка [4].
Отступ немного перепутались ...

import csv 

def main(): 
choice = "chew" 
filename=raw_input("enter the filename==> ") 
while choice != "swallow": 

    os_choice = raw_input('Enter "1" for Linux,\n  "2" for Windows\n  "3" for all others and\n  "4" to exit the script => ') 

    qu = "" 
    if os_choice == "1": 
     qu = "nix" 
    elif os_choice == "2": 
     qu = "win" 
    elif os_choice == "3": 
     qu = "other" 
    elif os_choice == "4": 
     choice = "swallow" 
     break 
    else: continue 
    #t=titleblock(filename) 
    #L=labels(filename) 
    c=content(filename, qu) 

# print(t,'\n',c,'\n',r,'\n') 
return 0 

def content(filename, qu): 

with open(qu+'_content_'+filename, 'wb') as content: 
    writer = csv.writer(content) 
    with open(filename, 'rb') as mycsv: 
     reader = csv.reader(mycsv) 
     counter = 0 

     for counter,row in enumerate(reader): 
      if counter < 7: continue 
#    if counter > ([-2:]) : break # This string-slicing technique doesn't work on lists made by csv module for some reason 
      rowEdit = [row[0],row[22],row[2], row[4], row[6], row[15], row[16], row[11], row[18], row[19], row[20], row[25], row[26], row[27], row[28], row[29], row[30], row[31]] 
      chklist=["OS", "Linux 2.4-2.6/Embedded Device", "Linux 2.4-2.6", "Linux 2.6", "Red Hat Enterprise Linux ES 4", "Red Hat Enterprise Linux Server 5.8", "Linux*"] 
      chklist2 = "Linux" 
      wchklist=["OS", "Windows Server 2003 Service Pack 2", "Windows Server 2008 R2 Enterprise 64 bit Edition Service Pack 1","Windows"] 
      ochklist=chklist+wchklist 
      if qu == "nix": 
       lisst = chklist 
       if any(item in row[4] for item in lisst): 
        #print(rowEdit) 
        writer.writerow(rowEdit) 
      elif qu == "win": 
       lisst = wchklist 
       if any(item in row[4] for item in lisst): 
        #print(rowEdit) 
        writer.writerow(rowEdit) 
      elif qu == "other": 
       lisst = ochklist 
       splisst = set(lisst) 
       #if any(item not in row[4] for item in lisst): 
       if splisst & row[4].split(): 
        print(rowEdit) 
        writer.writerow(rowEdit) 

В конце концов - охотился на тип(), который сделал это для меня ясно, - как обычно, я пытался слишком трудно.

elif qu == "other": 
lisst = ochklist 
if row[4] not in lisst: 
    #print("eureka") 
    #print(rowEdit) 
    writer.writerow(rowEdit) 

Спасибо, что помогли мне в этом.

ответ

3

Вы вводите в заблуждение тест с помощью петли; двигаться not к экспрессии в in тест в выражении генератора:

if any(item not in row[4] for item in lisst): 

The for item lisst часть петли над lisst элементов, а первая часть выражения генератора является фактическое испытание.

В зависимости от того, как row[4] структурирована, она может быть более производительной, чтобы сделать ваш белый список набора:

whitelist = set(lisst) 

if whitelist.intersection(row[4].split()): 
    # True if any whitespace separated value in `row[4]` is a member of whitelist too 
+0

Это проходит гладко, но создает файл со всеми 23 строк. Должен только создать файл с 1 элементом, специально сделанным, чтобы не быть в lisst –

+0

@WolfHalton: без лишних подробностей о содержимом 'lisst' и' row [4] 'невозможно сказать, что пойдет не так для вас. Не могли бы вы добавить некоторые из своих вопросов? –

+0

Traceback (самый последний вызов последнего): Файл "test061.py", строка 88, в основной() Файл "test061.py", строка 47, в главном с = содержание (имя файла, Цюй) файла «test061.py», строка 83, в содержании , если splist & row [4] .split(): ТипError: неподдерживаемый тип операндов для &: 'set' и 'list' –

Смежные вопросы