Я хочу сравнить строки в таблице (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)
Спасибо, что помогли мне в этом.
Это проходит гладко, но создает файл со всеми 23 строк. Должен только создать файл с 1 элементом, специально сделанным, чтобы не быть в lisst –
@WolfHalton: без лишних подробностей о содержимом 'lisst' и' row [4] 'невозможно сказать, что пойдет не так для вас. Не могли бы вы добавить некоторые из своих вопросов? –
Traceback (самый последний вызов последнего): Файл "test061.py", строка 88, в основной() Файл "test061.py", строка 47, в главном с = содержание (имя файла, Цюй) файла «test061.py», строка 83, в содержании , если splist & row [4] .split(): ТипError: неподдерживаемый тип операндов для &: 'set' и 'list' –