Python यूटिलिटी

इस सेक्शन में, आम समस्याओं को हल करने के लिए, Python के कई स्टैंडर्ड यूटिलिटी मॉड्यूल के बारे में बताया गया है.

फ़ाइल सिस्टम -- os, os.path, SMS

*os* और *os.path* मॉड्यूल में फ़ाइल सिस्टम के साथ इंटरैक्ट करने के लिए, कई फ़ंक्शन शामिल हैं. *shutil* मॉड्यूल, फ़ाइलों को कॉपी कर सकता है.

  • ओएस मॉड्यूल के दस्तावेज़
  • filenames = os.listmir(ख़िलाफ़) -- उस डायरेक्ट्री पाथ में मौजूद फ़ाइल नाम की सूची (इसमें शामिल नहीं है . और ..). फ़ाइल नाम सिर्फ़ डायरेक्ट्री में मौजूद नाम होते हैं, उनके ऐब्सलूट पाथ.
  • os.path.join(पार्टनर, फ़ाइल नाम) -- ऊपर दी गई सूची में से एक फ़ाइल नाम दिया गया है. इसका इस्तेमाल पाथ बनाने के लिए, डीआर और फ़ाइल नाम को एक साथ रखने के लिए करें
  • os.path.abspath(path) -- अगर कोई पाथ दिया गया हो, तो एक ऐब्सलूट फ़ॉर्म दिखाएं, जैसे /home/nick/foo/bar.html
  • os.path.drname(path), os.path.basename(path) -- दिया गया डर/foo/bar.html, "der/foo" नाम को वापस लौटाना होगा और Basename "bar.html"
  • os.path.exists(path) -- अगर यह मौजूद हो तो सही है
  • os.mkdr(ख़िलाफ़र_पाथ) -- एक डाइर बनाता है, os.makeders(mir_path) का इस पथ में सभी ज़रूरी डीर बनाने का.
  • Shotil.copy(source-path, dest-path) -- फ़ाइल कॉपी करें (डेस्ट पाथ डायरेक्ट्री मौजूद होनी चाहिए)
## Example pulls filenames from a dir, prints their relative and absolute paths
def printdir(dir):
  filenames = os.listdir(dir)
  for filename in filenames:
    print(filename)  ## foo.txt
    print(os.path.join(dir, filename)) ## dir/foo.txt (relative to current dir)
    print(os.path.abspath(os.path.join(dir, filename))) ## /home/nick/dir/foo.txt

मॉड्यूल को एक्सप्लोर करना, बिल्ट-इन Python help() और dr() फ़ंक्शन के साथ अच्छे से काम करता है. अनुवादक में, "Import os" करें और फिर इन निर्देशों का इस्तेमाल करके देखें कि मॉड्यूल में क्या उपलब्ध है: der(os), help(os.listmir), der(os.path), help(os.path.drname).

बाहरी प्रक्रियाएं चलाना -- सबप्रोसेस

*सबप्रोसेस* मॉड्यूल, किसी बाहरी कमांड को चलाने और उसके आउटपुट को कैप्चर करने का एक आसान तरीका है.

  • सबप्रोसेस मॉड्यूल के दस्तावेज़
  • आउटपुट = subprocess.check_Output(cmd, stderr=subprocess.STDOUT) -- निर्देश चलाता है, उसके बाहर निकलने का इंतज़ार करता है और आउटपुट टेक्स्ट देता है. कमांड को उसके स्टैंडर्ड आउटपुट और स्टैंडर्ड गड़बड़ी को एक आउटपुट टेक्स्ट में जोड़कर चलाया जाता है. यह प्रोसेस फ़ेल होने पर, CalledProcessError दिखता है.
  • अगर आपको सब-प्रोसेस को चलाने पर ज़्यादा कंट्रोल चाहिए, तो subprocess.popen क्लास देखें
  • एक सामान्य subप्रोसेस.call(cmd) भी है, जो कमांड देता है और अपने आउटपुट को आपके आउटपुट में डाल देता है और गड़बड़ी का कोड दिखाता है. यह तब काम करता है, जब आपको निर्देश देना हो, लेकिन उसके आउटपुट को अपने Python डेटा स्ट्रक्चर में कैप्चर करने की ज़रूरत न हो.
import subprocess

## Given a dir path, run an external 'ls -l' on it --
## shows how to call an external program
def listdir(dir):
  cmd = 'ls -l ' + dir
  print("Command to run:", cmd)   ## good to debug cmd before actually running it
  (status, output) = subprocess.getstatusoutput(cmd)
  if status:    ## Error case, print the command's output to stderr and exit
    sys.stderr.write(output)
    sys.exit(status)
  print(output)  ## Otherwise do something with the command's output

अपवाद

अपवाद, रन-टाइम की गड़बड़ी दिखाता है, जो किसी खास लाइन पर सामान्य एक्ज़ीक्यूशन को रोक देता है और कंट्रोल को गड़बड़ी के हैंडलिंग कोड पर ट्रांसफ़र कर देता है. इस सेक्शन में, अपवादों के सबसे बुनियादी इस्तेमाल के बारे में बताया गया है. उदाहरण के लिए, रनटाइम में होने वाली गड़बड़ी का मतलब यह हो सकता है कि प्रोग्राम में इस्तेमाल किए गए किसी वैरिएबल में कोई वैल्यू न हो (ValueError .. आपने शायद इसे कुछ बार देखा हो) या फ़ाइल मौजूद न होने की वजह से, फ़ाइल खोलने में होने वाली गड़बड़ी (IOError). अपवादों के ट्यूटोरियल में ज़्यादा जानें और अपवादों की पूरी सूची देखें.

बिना किसी गड़बड़ी के हैंडलिंग कोड (जैसा कि हमने अब तक किया है) के बिना, एक रन-टाइम अपवाद गड़बड़ी के मैसेज वाले प्रोग्राम को रोक देता है. यह एक अच्छा डिफ़ॉल्ट व्यवहार है और आपने इसे कई बार देखा है. आपके पास "कोशिश करें/अपवाद" के तौर पर कोई विकल्प जोड़ने का विकल्प है इस तरह के अपवादों को मैनेज करने के लिए, अपने कोड को स्ट्रक्चर करें:

  try:
    ## Either of these two lines could throw an IOError, say
    ## if the file does not exist or the read() encounters a low level error.
    f = open(filename, 'rb')
    data = f.read()
    f.close()
  except IOError:
    ## Control jumps directly to here if any of the above lines throws IOError.
    sys.stderr.write('problem reading:' + filename)
  ## In any case, the code then continues with the line after the try/except

'ट्राई करें' सेक्शन में वह कोड शामिल होता है जिसकी वजह से आपको गड़बड़ी का पता चल सकता है. इसके अलावा: अगर कोई अपवाद है, तो सेक्शन में वह कोड चलता है जिसे चलाना है. अगर कोई अपवाद नहीं है, तो इसे छोड़कर: सेक्शन को छोड़ दिया जाता है (इसका मतलब है कि वह कोड सिर्फ़ गड़बड़ी को ठीक करने के लिए है, कोड के मामले में यह "सामान्य" नहीं है). आपको अपवाद वाले ऑब्जेक्ट का पॉइंटर मिल सकता है. इसमें सिंटैक्स के साथ "IOError को e: .. के तौर पर छोड़कर" शामिल करें (e अपवाद ऑब्जेक्ट की ओर इशारा करता है). अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

एचटीटीपी -- urllib और urlparse

मॉड्यूल *urllib.request* यूआरएल को फ़ेच करने की सुविधा देता है -- इससे यूआरएल ऐसी फ़ाइल की तरह दिखता है जिसे पढ़ा जा सकता है. *urlparse* मॉड्यूल अलग-अलग यूआरएल को एक साथ रख सकता है.

  • urllib.request मॉड्यूल दस्तावेज़
  • ufile = urllib.request.urlopen(url) -- उस यूआरएल के लिए ऑब्जेक्ट जैसी फ़ाइल लौटाता है
  • text = ufile.read() -- इससे पढ़ा जा सकता है, जैसे कि कोई फ़ाइल (readlines() वगैरह. यह भी काम करती है)
  • जानकारी = ufile.info() -- उस अनुरोध की मेटा जानकारी. Info.gettype() mime प्रकार है, जैसे 'टेक्स्ट/html'
  • baseurl = ufile.geturl() -- "बेस" मिलता है अनुरोध के लिए यूआरएल. यह रीडायरेक्ट की वजह से मूल यूआरएल से अलग हो सकता है
  • urllib.request.urlretrieve(url, filename) -- दिए गए फ़ाइल पथ पर url डेटा डाउनलोड करता है
  • urllib.parse.urljoin(baseurl, url) -- अगर कोई यूआरएल भरा हुआ नहीं है या नहीं हो सकता है,तो जिस पेज से यह लिया गया है,उसका baseurl, पूरा यूआरएल देता है. बेस यूआरएल देने के लिए ऊपर geturl() का इस्तेमाल करें.

urllib.error में इसके सभी अपवाद हैं.

from urllib.request import urlopen

## Given a url, try to retrieve it. If it's text/html,
## print its base url and its text.
def wget(url):
  ufile = urlopen(url)  ## get file-like object for url
  info = ufile.info()   ## meta-info about the url content
  if info.get_content_type() == 'text/html':
    print('base url:' + ufile.geturl())
    text = ufile.read()  ## read all its text
    print(text)

ऊपर दिया गया कोड ठीक से काम करता है. हालांकि, अगर किसी यूआरएल के किसी वजह से काम नहीं करता है, तो इसमें गड़बड़ी ठीक करने के तरीके भी शामिल नहीं होते. यहां फ़ंक्शन का एक ऐसा वर्शन दिया गया है जो यूआरएल से जुड़ी कार्रवाई पूरी न होने पर, गड़बड़ी का मैसेज प्रिंट करने के लिए 'कोशिश करें'/'को छोड़कर' लॉजिक जोड़ा गया है.

अगर ऐसा लगता है कि urlopen() हैंग हो रहा है, तो हो सकता है कि आपका सिस्टम कुछ http पते. आप wget का उपयोग करके समान url प्राप्त करने का प्रयास करके इसकी पुष्टि कर सकते हैं या curl. अगर ये प्रोग्राम भी काम नहीं करते हैं, तो आपको प्रॉक्सी के ज़रिए एचटीटीपी कॉन्टेंट फ़ेच करना होगा सेवा. इस ट्यूटोरियल में प्रॉक्सी ऐक्सेस कॉन्फ़िगर करने की सुविधा शामिल नहीं की गई है.

## Version that uses try/except to print an error message if the
## urlopen() fails.
def wget2(url):
  try:
    ufile = urlopen(url)
    if ufile.info().get_content_type() == 'text/html':
      print(ufile.read())
  except IOError:
    print('problem reading url:', url)

कसरत

फ़ाइल सिस्टम और एक्सटर्नल कमांड मटीरियल की प्रैक्टिस करने के लिए, खास एक्सरसाइज़ कॉपी करें देखें. urllib कॉन्टेंट की प्रैक्टिस करने के लिए लॉग पज़ल एक्सरसाइज़ देखें.