2016-10-28 15 views
1

下面的代碼生成如何重寫以下內容以避免出現「嵌套塊」錯誤?

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層深。我沒有嵌入太多的文件I/O。我只是對一個變量進行非常廣泛的檢查,並創建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

相關問題