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.
这一行的语法不正确:
except IOError as (errno, strerror):
Run Code Online (Sandbox Code Playgroud)
正确的形式是:
except IOError as err:
Run Code Online (Sandbox Code Playgroud)
然后你可以检查err
像errno
等等的属性.
我不确定你从哪里获得原始行,它也不是有效的Python 2.x语法.