2011-10-15 5 views
6

J'ai un programme de générateur de ligne aléatoire écrit en Python2, mais j'ai besoin de le porter sur Python3. Vous donnez au programme l'option -n [nombre] et un argument de fichier pour lui indiquer de sortir aléatoirement [nombre] nombre de lignes du fichier. Voici la source du programme:portage Python 2 programme à Python 3, générateur de ligne aléatoire

#!/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() 


Quand je lance cela avec python3:

python3 randline.py -n 1 file.txt 

Je reçois l'erreur suivante:

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

Pouvez-vous me dire ce que cette erreur signifie et comment le réparer?

Merci!

Répondre

6

Cette ligne est une syntaxe incorrecte:

except IOError as (errno, strerror): 

La position correcte est:

except IOError as err: 

vous pouvez alors examiner err pour les attributs comme errno, etc.

Je ne suis pas sûr où vous avez obtenu la ligne d'origine, ce n'est pas une syntaxe Python 2.x valide non plus.

+0

Merci pour la solution! Ça marche! hmm c'est bizarre parce que le programme fonctionne avec python2 ... – Shubham

+0

Hmm, c'est peut-être une syntaxe Python 2.x valide, mais c'est * très * étrange. –

+0

@Ned Batchelder: Les exceptions sont des séquences dans Python 2.x. Je suppose que 'as (a, b)' effectue un déballage de tuple sur l'objet d'exception. Je vois [@Lennart Regebro] (http://stackoverflow.com/questions/7775062/porting-python-2-program-to-python-3-random-line-generator/7775321#7775321) déjà répondu. – jfs

9

La ligne "except IOError as (errno, strerror)" repose sur le peu utilisé fait obscure que les exceptions en Python 2 sont itératives, et que vous pouvez parcourir les paramètres donnés à l'exception par itérer l'exception elle-même. Cela, bien sûr, brise la règle "Explicit vaut mieux que l'implicite" de Python et a donc été supprimé dans Python 3, donc vous ne pouvez plus le faire. Au lieu de faire:

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

Ceci est plus clair et fonctionne sous toutes les versions de Python.