将Python2程序移植到Python3,随机行生成

2024-06-07 03:31:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用Python2编写的随机行生成器程序,但我需要将它移植到Python3。 给程序一个选项-n[number]和一个file参数,告诉它从文件中随机输出[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

你能告诉我这个错误是什么意思吗?怎么解决它?

谢谢!


Tags: self程序parsermainversiondefsysargs
3条回答

这一行的语法不正确:

except IOError as (errno, strerror):

正确的形式是:

except IOError as err:

然后,您可以检查err是否有errno等属性

我不确定原始行从何而来,它也不是有效的Python2.x语法。

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

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

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

这当然打破了Python的“显式优于隐式”规则,因此在Python 3中已经被删除,因此您不能再这样做了。取而代之的是:

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

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

相关问题 更多 >