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

Posted

技术标签:

【中文标题】将 Python 2 程序移植到 Python 3,随机行生成器【英文标题】:porting Python 2 program to Python 3, random line generator 【发布时间】:2011-12-08 04:07:04 【问题描述】:

我有一个用 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

你能告诉我这个错误是什么意思以及如何解决它吗?

谢谢!

【问题讨论】:

【参考方案1】:

"except IOError as (errno, strerror)" 行依赖于一个鲜为人知的事实,即 Python 2 中的异常是可迭代的,并且您可以通过迭代异常本身来迭代赋予异常的参数。

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

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

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

【讨论】:

【参考方案2】:

这行语法不正确:

except IOError as (errno, strerror):

正确的形式是:

except IOError as err:

然后您可以检查err 中的errno 等属性。

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

【讨论】:

感谢您的解决方案!有用!嗯,这很奇怪,因为该程序适用于 python2... 嗯,也许它是有效的 Python 2.x 语法,但它非常奇怪。 @Ned Batchelder:Python 2.x 中的序列例外。我猜as (a, b) 对异常对象执行元组解包。我看到@Lennart Regebro 已经回答了。【参考方案3】:

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

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

【讨论】:

以上是关于将 Python 2 程序移植到 Python 3,随机行生成器的主要内容,如果未能解决你的问题,请参考以下文章

将使用 Psyco 的 Python 应用程序移植到 Mac

python 用于将linux手册页移植到dash.app的实用程序

将 pyspark 代码移植到 Spark 2.4.3 的 scala 时出现 SparkException

将 CPP 定义移植到 python

如何在 Python 3 中腌制和取消腌制到可移植字符串

python2 与 python3 语法区别