【问题标题】:How can I rewrite the following to avoid a "Nesting Blocks" error?如何重写以下内容以避免“嵌套块”错误?
【发布时间】:2017-03-10 20:00:02
【问题描述】:

以下代码生成

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 层深的循环。我根本没有嵌套太多的文件 I/O。我只是对一个变量进行了非常广泛的检查并创建了两层深的文件。我的目标是为这个特定数据集的每个不同类创建单独的“.csv”文件。还有没有更好的方法来重写它,这样我就可以避免 SystemError?

【问题讨论】:

    标签: python-2.7 csv if-statement block with-statement


    【解决方案1】:

    你的opens 本质上是嵌套的,你有 23 个。您可以使用contextlib.ExitStack()(Python 2.7 中的contextlib2)来包含多个上下文,从而避免嵌套。

    请参阅How to open more than 19 files in parallel (Python)? 了解一些很好的示例。

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 对不起。这仍然会产生相同的错误。这是否意味着我需要为 csv.writer 和选项使用字典?
      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2020-06-07
      • 2021-07-12
      • 2012-10-05
      • 2019-01-02
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多