2011-10-15 13 views
6

Ho un programma di generatore di riga casuale scritto in Python2, ma ho bisogno di portarlo su Python3. Si dà al programma l'opzione -n ​​[numero] e un argomento file per dirgli di emettere casualmente [numero] numero di righe dal file. Qui è la sorgente del programma:porting del programma Python 2 a Python 3, generatore di linee casuali

#!/usr/bin/python 

import random, sys 
from optparse import OptionParser 

class randline: 
    def __init__(self, filename): 
     f = open(filename, 'r') 
     self.lines = f.readlines() 
     f.close() 

    def chooseline(self): 
     return random.choice(self.lines) 

def main(): 
    version_msg = "%prog 2.0" 
    usage_msg = """%prog [OPTION]... [FILE] [FILE]... 

Output randomly selected lines from each FILE.""" 

    parser = OptionParser(version=version_msg, 
          usage=usage_msg) 
    parser.add_option("-n", "--numlines", 
         action="store", dest="numlines", default=1, 
         help="output NUMLINES lines (default 1)") 
    options, args = parser.parse_args(sys.argv[1:]) 

    try: 
     numlines = int(options.numlines) 
    except: 
     parser.error("invalid NUMLINES: {0}". 
        format(options.numlines)) 
    if numlines < 0: 
     parser.error("negative count: {0}". 
        format(numlines)) 
    if len(args) < 1: 
     parser.error("input at least one operand!") 

    for index in range(len(args)): 
     input_file = args[index] 
     try: 
      generator = randline(input_file) 
      for index in range(numlines): 
       sys.stdout.write(generator.chooseline()) 
     except IOError as (errno, strerror): 
      parser.error("I/O error({0}): {1}". 
         format(errno, strerror)) 

if __name__ == "__main__": 
    main() 


Quando eseguo questo con python3:

python3 randline.py -n 1 file.txt 

ottengo il seguente errore:

File "randline.py", line 66 
    except IOError as (errno, strerror): 
        ^
SyntaxError: invalid syntax 

Potete dirmi cosa questo errore significa e come risolverlo?

Grazie!

risposta

6

questa linea è sintassi non corretta:

except IOError as (errno, strerror): 

La forma corretta è:

except IOError as err: 

allora si può esaminare err per attributi come errno, ecc

non sono sicuro da dove hai preso la linea originale, non è valida neanche la sintassi Python 2.x.

+0

Grazie per la soluzione! Funziona! hmm questo è strano perché il programma funziona con python2 ... – Shubham

+0

Hmm, forse è valida la sintassi Python 2.x, ma è * molto * strano. –

+0

Batchelder @Ned: le eccezioni sono sequenze in Python 2.x. Immagino 'as (a, b)' compia tuple decompressione sull'oggetto eccezione. Vedo che [@Lennart Regebro] (http://stackoverflow.com/questions/7775062/porting-python-2-program-to-python-3-random-line-generator/7775321#7775321) ha già risposto. – jfs

9

La linea "except IOError as (errno, strerror)" si basa su un piccolo utilizzata fatto oscuro che eccezioni in Python 2 sono iterabile, e che si può scorrere i parametri indicati per l'eccezione dalla iterazione su l'eccezione stessa.

Questo ovviamente interrompe la regola "Explicit is better than implicit" di Python e come tale è stato rimosso in Python 3, quindi non è più possibile farlo. Invece:

except IOError as e: 
    errno, strerror = e.args 

Questo è più chiaro e funziona con tutte le versioni di Python.

Problemi correlati