przenoszenie programu Python 2 na Python 3, generator losowych linii


Mam program generatora ciągów losowych napisany w Python2, ale muszę go przenieść na Python3.
Dajesz programowi opcję -n [liczba] i argument plikowy, aby wyprowadził losowo [liczba] liczbę wierszy z pliku.
Oto kod źródłowy programu:
#!/usr/bin/pythonimport random, sys
from optparse import OptionParserclass 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 uruchamiam to z python3:
python3 randline.py -n 1 file.txt

Otrzymuję następujący błąd:
File "randline.py", line 66
except IOError as (errno, strerror):
^
SyntaxError: invalid syntax

Czy możesz mi powiedzieć, co oznacza ten błąd i jak go naprawić?
Podziękować!
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Linia
"oprócz IOError as (errno, strerror)"
opiera się na rzadko używanym niejasnym fakcie, że wyjątki w Pythonie 2 są iteracyjne i że możesz iterować przez parametry podane dla wyjątku, iterując po sam wyjątek.
To oczywiście narusza zasadę Pythona „Wyraźne jest lepsze niż niejawne” i jako takie zostało usunięte w Pythonie 3, więc nie można już tego robić. Zamiast tego zrób:
except IOError as e:
errno, strerror = e.args

Jest to bardziej przejrzyste i działa we wszystkich wersjach Pythona.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ta linia ma nieprawidłową składnię:
except IOError as (errno, strerror):

Prawidłowa forma to:
except IOError as err:

wtedy możesz sprawdzić
err
pod kątem atrybutów takich jak
errno
i tak dalej.
Nie jestem pewien, skąd masz oryginalny ciąg znaków, również nie jest to poprawna składnia Pythona 2.x.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby przekonwertować program z języka python 2 na python 3, użyj narzędzia 2to3.
http:// docs.python.org/library/2to3. html
http://docs.python.org/library/2to3.html

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się