2016-10-28 1 views
1

Следующий код создаетКак я могу переписать следующее, чтобы избежать ошибки «Nesting Blocks»?

SystemError: too many statically nested blocks

import csv 
with open('complexdatset.csv','r'), open ('back.csv','w'), open ('buffer_overflow.csv','w'), open ('ftp_write.csv','w'), open ('guess_passwd.csv','w'), open ('imap.csv','w'), open ('ipsweep.csv','w'), open ('land.csv','w'), open ('loadmodule.csv','w'), open ('multihop.csv','w'), open ('neptune.csv','w'), open ('nmap.csv','w'), open ('perl.csv','w'), open ('phf.csv','w'), open ('pod.csv','w'), open ('portsweep.csv','w'), open ('rootkit.csv','w'), open ('satan.csv','w'), open ('smurf.csv','w'), open ('spy.csv','w'), open ('teardrop.csv','w'), open ('warezclient.csv','w'), open ('warezmaster.csv','w') as fin, back, buffer_overflow, ftp_write, guess_passwd, imap, ipsweep, land, loadmodule, multihop, neptune, nmap, perl, phf, pod, portsweep, rootkit, satan, smurf, spy, teardrop, warezclient, warezmaster: 
    writer0 = csv.writer(back, delimiter=',') 
    writer1 = csv.writer(buffer_overflow, delimiter=',') 
    writer2 = csv.writer(ftp_write, delimiter=',') 
    writer3 = csv.writer(guess_passwd, delimiter=',') 
    writer4 = csv.writer(imap, delimiter=',') 
    writer5 = csv.writer(land, delimiter=',') 
    writer6 = csv.writer(loadmodule, delimiter=',') 
    writer7 = csv.writer(multihop, delimiter=',') 
    writer8 = csv.writer(neptune, delimiter=',') 
    writer9 = csv.writer(nmap, delimiter=',') 
    writer10 = csv.writer(perl, delimiter=',') 
    writer11 = csv.writer(phf, delimiter=',') 
    writer12 = csv.writer(pod, delimiter=',') 
    writer13 = csv.writer(portsweep, delimiter=',') 
    writer14 = csv.writer(rootkit, delimiter=',') 
    writer15 = csv.writer(satan, delimiter=',') 
    writer16 = csv.writer(smurf, delimiter=',') 
    writer17 = csv.writer(spy, delimiter=',') 
    writer18 = csv.writer(teardrop, delimiter=',') 
    writer19 = csv.writer(warezclient, delimiter=',') 
    writer20 = csv.writer(warezmaster, delimiter=',') 
    for row in csv.reader(fin, delimiter=','): 
     if row[41] == 'back': 
      writer0.writerow(row) 
     elif row[41] == 'buffer_overflow': 
      writer1.writerow(row) 
     elif row[41] == 'ftp_write': 
      writer2.writerow(row) 
     elif row[41] == 'guess_passwd': 
      writer3.writerow(row) 
     elif row[41] == 'imap': 
      writer4.writerow(row) 
     elif row[41] == 'land': 
      writer5.writerow(row) 
     elif row[41] == 'loadmodule': 
      writer6.writerow(row) 
     elif row[41] == 'multihop': 
      writer7.writerow(row) 
     elif row[41] == 'neptune': 
      writer8.writerow(row) 
     elif row[41] == 'nmap': 
      writer9.writerow(row) 
     elif row[41] == 'perl': 
      writer10.writerow(row) 
     elif row[41] == 'phf': 
      writer11.writerow(row) 
     elif row[41] == 'pod': 
      writer12.writerow(row) 
     elif row[41] == 'portsweep': 
      writer13.writerow(row) 
     elif row[41] == 'rootkit': 
      writer14.writerow(row) 
     elif row[41] == 'satan': 
      writer15.writerow(row) 
     elif row[41] == 'smurf': 
      writer16.writerow(row) 
     elif row[41] == 'spy': 
      writer17.writerow(row) 
     elif row[41] == 'teardrop': 
      writer18.writerow(row) 
     elif row[41] == 'warezclient': 
      writer19.writerow(row) 
     elif row[41] == 'warezmaster': 
      writer20.writerow(row) 

Мой вопрос почему он генерирует эту ошибку? Я искал в Интернете, но все примеры имели петли, вложенные в 20 уровней. У меня нет файлов ввода/вывода, вложенных в это много. Я просто делаю очень обширные проверки для одной переменной и создаю файлы на 2 уровня. Моя цель состояла в создании отдельных файлов .csv для каждого из разных классов этого конкретного набора данных. Также есть лучший способ переписать это, чтобы я мог избежать SystemError?

ответ

0

использовать словарь для опций:

import csv 



with open('complexdatset.csv','r'), open ('back.csv','w'), open ('buffer_overflow.csv','w'), open ('ftp_write.csv','w'), open ('guess_passwd.csv','w'), open ('imap.csv','w'), open ('ipsweep.csv','w'), open ('land.csv','w'), open ('loadmodule.csv','w'), open ('multihop.csv','w'), open ('neptune.csv','w'), open ('nmap.csv','w'), open ('perl.csv','w'), open ('phf.csv','w'), open ('pod.csv','w'), open ('portsweep.csv','w'), open ('rootkit.csv','w'), open ('satan.csv','w'), open ('smurf.csv','w'), open ('spy.csv','w'), open ('teardrop.csv','w'), open ('warezclient.csv','w'), open ('warezmaster.csv','w') as fin, back, buffer_overflow, ftp_write, guess_passwd, imap, ipsweep, land, loadmodule, multihop, neptune, nmap, perl, phf, pod, portsweep, rootkit, satan, smurf, spy, teardrop, warezclient, warezmaster: 
    writer0 = csv.writer(back, delimiter=',') 
    writer1 = csv.writer(buffer_overflow, delimiter=',') 
    writer2 = csv.writer(ftp_write, delimiter=',') 
    writer3 = csv.writer(guess_passwd, delimiter=',') 
    writer4 = csv.writer(imap, delimiter=',') 
    writer5 = csv.writer(land, delimiter=',') 
    writer6 = csv.writer(loadmodule, delimiter=',') 
    writer7 = csv.writer(multihop, delimiter=',') 
    writer8 = csv.writer(neptune, delimiter=',') 
    writer9 = csv.writer(nmap, delimiter=',') 
    writer10 = csv.writer(perl, delimiter=',') 
    writer11 = csv.writer(phf, delimiter=',') 
    writer12 = csv.writer(pod, delimiter=',') 
    writer13 = csv.writer(portsweep, delimiter=',') 
    writer14 = csv.writer(rootkit, delimiter=',') 
    writer15 = csv.writer(satan, delimiter=',') 
    writer16 = csv.writer(smurf, delimiter=',') 
    writer17 = csv.writer(spy, delimiter=',') 
    writer18 = csv.writer(teardrop, delimiter=',') 
    writer19 = csv.writer(warezclient, delimiter=',') 
    writer20 = csv.writer(warezmaster, delimiter=',') 
    options = { 
     'back': writer0.writerow, 
     'buffer_overflow': writer1.writerow, 
     'ftp_write' : writer2.writerow, 
     'guess_passwd' : writer3.writerow, 
     'imap' :writer4.writerow, 
     'land':writer5.writerow, 
     'loadmodule':writer6.writerow, 
     'multihop':writer7.writerow, 
     'neptune':writer8.writerow, 
     'nmap':writer9.writerow, 
     'perl':writer10.writerow, 
     'phf':writer11.writerow, 
     'pod':writer12.writerow, 
     'portsweep':writer13.writerow, 
     'rootkit':writer14.writerow, 
     'satan':writer15.writerow, 
     'smurf':writer16.writerow, 
     'spy':writer17.writerow, 
     'teardrop':writer18.writerow, 
     'warezclient':writer19.writerow, 
     'warezmaster':writer20.writerow, 
    } 
    for row in csv.reader(fin, delimiter=','): 
     if row[41] in options.keys() : 
      options[row[41]](row) 
+0

Извините. Это все равно генерирует ту же ошибку. Было ли это означать, что мне нужно будет использовать словарь для csv.writer и параметров? – user3255824

0

Ваши open s являются по сути вложенными, и у вас есть 23 из них. Вы можете использовать contextlib.ExitStack() (contextlib2 в Python 2.7), чтобы содержать несколько контекстов, тем самым избегая вложенности.

См. How to open more than 19 files in parallel (Python)? для некоторых хороших примеров.

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