এই বিভাগে, আমরা সাধারণ সমস্যা সমাধানের জন্য পাইথনের অনেকগুলি স্ট্যান্ডার্ড ইউটিলিটি মডিউলের কয়েকটি দেখি।
ফাইল সিস্টেম -- os, os.path, shutil
*os* এবং *os.path* মডিউলগুলি ফাইল সিস্টেমের সাথে ইন্টারঅ্যাক্ট করার জন্য অনেকগুলি ফাংশন অন্তর্ভুক্ত করে। *শুটিল* মডিউল ফাইল কপি করতে পারে।
- ওএস মডিউল ডক্স
- filenames = os.listdir(dir) -- সেই ডিরেক্টরি পাথে ফাইলের নামের তালিকা (. এবং .. সহ নয়)। ফাইলের নামগুলি শুধুমাত্র ডিরেক্টরির নাম, তাদের সম্পূর্ণ পাথ নয়।
- os.path.join(dir, ফাইলের নাম) -- উপরের তালিকা থেকে একটি ফাইলের নাম দেওয়া হয়েছে, একটি পথ তৈরি করতে dir এবং ফাইলের নাম একসাথে রাখতে এটি ব্যবহার করুন
- os.path.abspath(পথ) -- একটি পাথ দেওয়া হলে, একটি পরম ফর্ম ফেরত দিন, যেমন /home/nick/foo/bar.html
- os.path.dirname(path), os.path.basename(path) -- দেওয়া dir/foo/bar.html, dirname "dir/foo" এবং basename "bar.html" ফেরত দিন
- os.path.exists(path) -- সত্য যদি এটি বিদ্যমান থাকে
- os.mkdir(dir_path) -- একটি ডির তৈরি করে, os.makedirs(dir_path) এই পথে প্রয়োজনীয় সকল ডির তৈরি করে
- shutil.copy(উৎস-পথ, গন্তব্য-পথ) -- একটি ফাইল অনুলিপি করুন (গন্তব্য পথ ডিরেক্টরি থাকা উচিত)
## 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
একটি মডিউল অন্বেষণ বিল্ট-ইন পাইথন সাহায্য() এবং dir() ফাংশনগুলির সাথে ভাল কাজ করে। ইন্টারপ্রেটারে, একটি "import os" করুন, এবং তারপর এই কমান্ডগুলি ব্যবহার করুন মডিউলে কী পাওয়া যায় তা দেখুন: dir(os), help(os.listdir), dir(os.path), help(os.path.dirname) )
বাহ্যিক প্রক্রিয়া চলমান -- সাবপ্রসেস
*সাবপ্রসেস* মডিউল হল একটি বাহ্যিক কমান্ড চালানো এবং এর আউটপুট ক্যাপচার করার একটি সহজ উপায়।
- সাবপ্রসেস মডিউল ডক্স
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) -- কমান্ড চালায়, এটি প্রস্থান করার জন্য অপেক্ষা করে এবং এর আউটপুট পাঠ্য ফেরত দেয়। কমান্ডটি তার স্ট্যান্ডার্ড আউটপুট এবং একটি আউটপুট পাঠ্যের সাথে মিলিত স্ট্যান্ডার্ড ত্রুটি সহ চালানো হয়। এটি ব্যর্থ হলে, এটি একটি CalledProcessError নিক্ষেপ করে।
- আপনি যদি সাব-প্রসেস চালানোর উপর আরও নিয়ন্ত্রণ চান, তাহলে subprocess.popen ক্লাস দেখুন
- এছাড়াও একটি সাধারণ subprocess.call(cmd) রয়েছে যা কমান্ড চালায় এবং এর আউটপুট আপনার আউটপুটে ডাম্প করে এবং এরর কোড প্রদান করে। আপনি কমান্ড চালাতে চাইলে এটি কাজ করে কিন্তু আপনার পাইথন ডেটা স্ট্রাকচারে এর আউটপুট ক্যাপচার করার প্রয়োজন নেই।
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 ব্যতীত (ই ব্যতিক্রম অবজেক্টের দিকে নির্দেশ করে)।
HTTP -- urllib এবং urlparse
*urllib.request* মডিউলটি url আনয়ন প্রদান করে -- একটি ইউআরএলকে একটি ফাইলের মতো দেখায় যা থেকে আপনি পড়তে পারেন। *urlparse* মডিউল আলাদা করে url একসাথে রাখতে পারে।
- urllib.request মডিউল ডক্স
- ufile = urllib.request.urlopen(url) -- সেই url-এর জন্য বস্তুর মতো একটি ফাইল ফেরত দেয়
- text = ufile.read() -- এটি থেকে পড়তে পারে, যেমন একটি ফাইল (readlines() ইত্যাদিও কাজ করে)
- info = ufile.info() -- সেই অনুরোধের জন্য মেটা তথ্য। info.gettype() হল mime প্রকার, যেমন 'text/html'
- baseurl = ufile.geturl() -- অনুরোধের জন্য "বেস" url পায়, যা পুনঃনির্দেশের কারণে মূল থেকে ভিন্ন হতে পারে
- urllib.request.urlretrieve(url, ফাইলের নাম) -- প্রদত্ত ফাইল পাথে url ডেটা ডাউনলোড করে
- urllib.parse.urljoin(baseurl, url) -- একটি url দেওয়া হয় যা পূর্ণ হতে পারে বা নাও হতে পারে, এবং এটি যে পৃষ্ঠা থেকে এসেছে তার baseurl, একটি সম্পূর্ণ url ফেরত দিন। বেস ইউআরএল প্রদান করতে উপরে 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)
উপরের কোডটি সূক্ষ্মভাবে কাজ করে, কিন্তু কোনো কারণে কোনো url কাজ না করলে ত্রুটি হ্যান্ডলিং অন্তর্ভুক্ত করে না। এখানে ফাংশনের একটি সংস্করণ রয়েছে যা url অপারেশন ব্যর্থ হলে একটি ত্রুটি বার্তা প্রিন্ট করার জন্য চেষ্টা/ব্যতীত যুক্তি যোগ করে।
যদি urlopen()
হ্যাং হয়ে থাকে বলে মনে হয়, আপনার সিস্টেম কিছু HTTP ঠিকানায় সরাসরি অ্যাক্সেসের অনুমতি নাও দিতে পারে। আপনি wget
বা curl
ব্যবহার করে একই url আনার চেষ্টা করে এটি যাচাই করতে পারেন। যদি এই প্রোগ্রামগুলিও ব্যর্থ হয়, তাহলে আপনাকে একটি প্রক্সি পরিষেবার মাধ্যমে HTTP সামগ্রী আনতে হবে৷ প্রক্সি অ্যাক্সেস কনফিগার করা এই টিউটোরিয়াল দ্বারা আচ্ছাদিত নয়।
## 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 উপাদান অনুশীলন করতে, লগ পাজল অনুশীলন দেখুন।