Как я могу переписать следующее, чтобы избежать ошибки вложенных блоков?

Следующий код генерирует

SystemError: слишком много статически вложенных блоков

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?


person user3255824    schedule 28.10.2016    source источник


Ответы (2)


используйте словарь для вариантов:

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)
person Kennet Celeste    schedule 28.10.2016
comment
Извиняюсь. Это по-прежнему генерирует ту же ошибку. Означает ли это, что мне нужно будет использовать словарь как для csv.writer, так и для параметров? - person user3255824; 08.11.2016

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

Несколько хороших примеров см. в разделе Как открыть более 19 файлов параллельно (Python)?.

person leekaiinthesky    schedule 26.04.2017