2011-10-15 16 views
6

Mam program generatora linii losowych napisany w Python2, ale muszę przenieść go do Python3. Dajesz programowi opcję -n [numer] i argument pliku, aby poinformować go, aby losowo wyprowadził [numer] liczbę linii z pliku. Oto źródło programu:przenoszenie programu Python 2 do Pythona 3, generator losowej linii

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


Kiedy uruchomić to z python3:

python3 randline.py -n 1 file.txt 

pojawia się następujący błąd:

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

możesz mi powiedzieć, co ten błąd oznacza i jak to naprawić?

Dzięki!

Odpowiedz

6

Linia ta jest błędna składnia:

except IOError as (errno, strerror): 

Poprawna forma to:

except IOError as err: 

następnie można zbadać err dla atrybutów takich jak errno itp

nie jestem pewien skąd masz oryginalną linię, nie jest to również poprawna składnia w Pythonie 2.x.

+0

Dzięki za rozwiązanie! to działa! hmm to dziwne, ponieważ program działa z python2 ... – Shubham

+0

Hmm, może to jest poprawna składnia Pythona 2.x, ale jest * bardzo * dziwna. –

+0

@Ned Batchelder: Wyjątkiem są sekwencje w Pythonie 2.x. Przypuszczam, że 'as (a, b)' wykonuje rozpakowanie krotki na obiekcie wyjątku. Widzę, że [@ Lennart Regebro] (http://stackoverflow.com/questions/7775062/porting-python-2-program-to-python-3-random-line-generator/7775321#7775321) już na nie odpowiedział. – jfs

9

Linia "except IOError as (errno, strerror)" opiera się na mało używane niejasnych fakt, że wyjątki w Pythonie 2 są iterable, i że można iteracyjne nad parametrami podanymi wyjątku przez powtarzanie przez samego wyjątku.

To oczywiście łamie zasadę "Jawny jest lepszy niż niejawny" w Pythonie i jako takie zostało usunięte w Pythonie 3, więc nie możesz już tego robić. Zamiast tego:

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

Jest to bardziej przejrzyste i działa pod wszystkimi wersjami Pythona.

Powiązane problemy