将Python 2程序移植到Python 3,随机行生成器

Shu*_*ham 6 python python-2.x python-3.x

我有一个用Python2编写的随机生成器程序,但我需要将它移植到Python3.为程序提供选项-n [number]和一个文件参数,告诉它从文件中随机输出[number]行数.以下是该计划的来源:

#!/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()
Run Code Online (Sandbox Code Playgroud)


当我用python3运行时:

python3 randline.py -n 1 file.txt
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

你能告诉我这个错误意味着什么以及如何修复它吗?

谢谢!

Len*_*bro 13

该行"except IOError as (errno, strerror)"依赖于一个很少使用的模糊事实,即Python 2中的异常是可迭代的,并且您可以通过迭代异常本身来迭代给予异常的参数.

这当然打破了Python的"Explicit is better than implicit"规则,并且已经在Python 3中删除了,所以你不能再这样做了.相反:

except IOError as e:
   errno, strerror = e.args
Run Code Online (Sandbox Code Playgroud)

这更清晰,适用于所有版本的Python.


Ned*_*der 6

这一行的语法不正确:

except IOError as (errno, strerror):
Run Code Online (Sandbox Code Playgroud)

正确的形式是:

except IOError as err:
Run Code Online (Sandbox Code Playgroud)

然后你可以检查errerrno等等的属性.

我不确定你从哪里获得原始行,它也不是有效的Python 2.x语法.