2011-10-15 10 views
6

私はPython2で記述されたランダムなラインジェネレータプログラムを持っていますが、Python3に移植する必要があります。 プログラムにオプション-n [number]とfile引数を与え、ファイルから[number]行数をランダムに出力するように指示します。ここ は、プログラムのソースです:Python 2プログラムをPython 3、ランダムなラインジェネレータに移植する

#!/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 

あなたが私に何を伝えることができますこのエラーの意味と修正方法

ありがとうございます!

答えて

6

この行は正しくない構文です:

except IOError as (errno, strerror): 

正しい形式は次のとおりです。

except IOError as err: 

、あなたはerrnoのような属性のerrを調べることができ、など

私はわかりません元の行を取得した場所では、有効なPython 2.x構文でもありません。

+0

解決していただきありがとうございます。できます!ちょっと変わったことは、プログラムがpython2で動作するからです... – Shubham

+0

うーん、多分有効なPython 2.xの構文ですが、それは*非常に奇妙です。 –

+0

@Ned Batchelder:例外はPython 2.xのシーケンスです。私は 'as(a、b)'が例外オブジェクトに対してタプルアンパックを実行すると思います。私は[@Lennart Regebro](http://stackoverflow.com/questions/7775062/porting-python-2-program-to-python-3-random-line-generator/7775321#7775321)がすでにそれに答えています。 – jfs

9

ライン"except IOError as (errno, strerror)"は、Python 2で例外が反復可能であり、あなたは例外自体を反復処理により例外に与えられたパラメータを反復処理することができることを少し使用あいまいな事実に依存します。

これはもちろん、「明示的なものは暗黙のものよりも優れています」というルールを破っており、Python 3では削除されているため、もはやそのことはできません。代わりに:

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

これは明確で、すべてのバージョンのPythonで動作します。

関連する問題