2011-10-15 7 views
6

मेरे पास पाइथन 2 में लिखा गया एक यादृच्छिक रेखा जनरेटर प्रोग्राम है, लेकिन मुझे इसे Python3 पर पोर्ट करने की आवश्यकता है। आप प्रोग्राम को विकल्प-एन [संख्या] और एक फाइल तर्क देते हैं जो फ़ाइल से लाइनों की यादृच्छिक रूप से आउटपुट [संख्या] संख्या को बताने के लिए कहता है। यहां कार्यक्रम के लिए स्रोत है:पायथन 2 प्रोग्राम को पाइथन 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 

आप मुझे बता सकते हैं क्या इस त्रुटि का मतलब है और इसे कैसे ठीक किया जाए?

धन्यवाद!

except IOError as (errno, strerror): 

सही रूप है::

उत्तर

6

इस लाइन गलत वाक्यविन्यास है

except IOError as err: 

तो आप errno जैसी विशेषताओं के लिए err जांच कर सकते हैं, आदि

मैं सुनिश्चित नहीं हूं जहां से आप मूल रेखा प्राप्त कर चुके हैं, यह वैध पायथन 2.x वाक्यविन्यास मान्य नहीं है।

+0

समाधान के लिए धन्यवाद! यह काम करता हैं! हम्म अजीब है क्योंकि कार्यक्रम python2 के साथ काम करता है ... – Shubham

+0

हम्म, शायद यह वैध पायथन 2.x वाक्यविन्यास है, लेकिन यह * बहुत * अजीब है। –

+0

@Ned Batchelder: अपवाद पाइथन 2.x में अनुक्रम हैं। मुझे लगता है कि 'ए, बी)' अपवाद ऑब्जेक्ट पर अनपॅकिंग निष्पादित करता है। मैं देखता हूं [@Lennart Regebro] (http://stackoverflow.com/questions/7775062/porting-python-2-program-to-python-3-random-line-generator/7775321#7775321) पहले से ही इसका उत्तर दिया है। – jfs

-1

अपने प्रोग्राम को पायथन 2 से पायथन 3 में कनवर्ट करने के लिए, 2to3 टूल का उपयोग करें।

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

9

लाइन "except IOError as (errno, strerror)" एक छोटे से अधिक इस्तेमाल किया अस्पष्ट तथ्य यह है कि अजगर 2 में अपवाद iterable हैं, और आप अपवाद पर ही पुनरावृत्ति द्वारा अपवाद को दिए गए मापदंडों से अधिक पुनरावृति कर सकते हैं कि पर निर्भर करता है।

यह निश्चित रूप से पाइथन के "अंतर्निहित स्पष्ट" नियम को तोड़ देता है और इसे पाइथन 3 में हटा दिया गया है, इसलिए आप अब ऐसा नहीं कर सकते हैं। इसके बजाय:

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

यह स्पष्ट है और पायथन के सभी संस्करणों के तहत काम करता है।

संबंधित मुद्दे