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

时间:2011-10-15 01:04:16

标签: python python-3.x python-2.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()


当我用python3运行它时:

python3 randline.py -n 1 file.txt

我收到以下错误:

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

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

谢谢!

3 个答案:

答案 0 :(得分:11)

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

这当然打破了Python的“明确胜过隐式”规则,并且已经在Python 3中删除了,所以你不能再这样做了。而是做:

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

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

答案 1 :(得分:6)

此行的语法不正确:

except IOError as (errno, strerror):

正确的形式是:

except IOError as err:

然后您可以检查errerrno等属性

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

答案 2 :(得分:-1)

要将程序从python 2转换为python 3,请使用2to3工具。

http://docs.python.org/library/2to3.html