将 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的实用程序