آموزش زبان برنامه نویسی پایتون#جلسه هشتم

آموزش زبان برنامه نویسی پایتون#جلسه هشتم

بسم الله الرحمن الرحیم

جلسه هشتم آموزش پایتون

مدیریت فایل در پایتون

در ادامه مجموعه ی آموزش زبان برنامه نویسی پایتون، با جلسه هشتم در خدمت شما هستیم. یکی از ساده ترین روش ها برای برنامه ها جهت مدیریت داده هایشان، خواندن و نوشتن درون فایل متنی می باشد.
 
learning python 8th

بسم الله الرحمن الرحیم

جلسه هشتم

مدیریت فایل در پایتون

در ادامه مجموعه ی آموزش زبان برنامه نویسی پایتون، با جلسه هشتم در خدمت شما هستیم. یکی از ساده ترین روش ها برای برنامه ها جهت مدیریت داده هایشان، خواندن و نوشتن درون فایل متنی می باشد.
پس از import کردن ماژول os، دستور (dir(os یک لیست مرتب شده از رشته ها را بر می گرداند. تابع ()dir  بدون آرگومان، اسامی تعریف شده در ماژول  را بر می گرداند و لیستی شامل تمام انواع اسم از قبیل متغییرها، توابع، ماژول ها، لیست ها، مجموعه ها، دیکمشنری ها و ... را ارائه می دهد.
توجه: ()dir اسامی داخل توابع و متغییر ها را لیست نمی کند . برای لیست کردن این اسامی، می توان از ماژول استاندارد  __builtin__ (در پایتون 2)  و یا builtins (در پایتون 3)، استفاده کرد.


>>> import os
>>> dir(os)
['F_OK', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'UserDict', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_reg', '_execvpe', '_exists', '_exit', '_get_exports_list', '_make_stat_result', '_make_statvfs_result', '_pickle_stat_result', '_pickle_statvfs_result', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'curdir', 'defpath', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fstat', 'fsync', 'getcwd', 'getcwdu', 'getenv', 'getpid', 'isatty', 'kill', 'linesep', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'popen2', 'popen3', 'popen4', 'putenv', 'read', 'remove', 'removedirs', 'rename', 'renames', 'rmdir', 'sep', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'sys', 'system', 'tempnam', 'times', 'tmpfile', 'tmpnam', 'umask', 'unlink', 'unsetenv', 'urandom', 'utime', 'waitpid', 'walk', 'write']



فرض کنید در درایو C کامپیوتر فولدری با نام files وجود دارد، برای افزودن یک دایرکتوری به مسیر اصلی، از متد ()join که در ماژول pathاست استفاده می شود. این متد دو پارامتر دریافت می کند. پارامتر اول مشخص کننده مسیر اصلی و پارامتر دوم بیانگر دایرکتوری است که می خواهیم به مسیر اولیه افزوده شود، تا مسیر نهایی ساخته شود. به عبارتی ازاین متد برای افزودن دو یا چند مسیر به هم استفاده می شود و خروجی آن یک رشته است که مسیر نهایی را نشان می دهد.

 

 


>>> p = os.path.join('C:/', 'files')
>>> type(p)

>>> 
>>> p
'C:/files'

 برای آنکه لیست تمامی فایل های موجود در این مسیر نشان داده شود، از دستور ()listdir استفاده می شود. مسیری که این متد بع عنوان ورودی دریافت می کند، ممکن است از نوع bytes و یا  رشته (str) باشد. توجه کنید که خروجی این دستور یک لیست است و محتوا درون براکت نمایش داده می شود. خروجی نمایش داده شده توسط این دستور شامل فایل های خاص که دارای "." یا ".." می باشد، نیست، مگر آنکه این فایل ها درون دایرکتوری نمایش داده شده باشند.

learning python

 

 


>>> os.listdir(p)
['iso files', 'IT', 'ITIL.pdf', 'ride.docx', 'whatsnew.txt']

نشانه‌گذاری انتهای سطر در پایتون:

در قرارداد سیستم‌های عامل گوناگون از رشته‌های مختلفی برای نشانه‌گذاری انتهای سطرهای یک فایل متنی استفاده می شود، این رشته ها ممکن است یک کاراکتری ("\n") یا چند کاراکتری( مانند "\r\n") باشند. برای مثال در لینوکس از "\n"، در Mac OS X از "\r" و در ویندوز از "\r\n" استفاده می شود.

دستورos.linesep  رشته Newline سیستم عامل میزبان را برمی‌گرداند، اما هنگامی که فایل باز است، برای نشانه‌گذاری انتهای سطر فعلی و رفتن به سطر جدید در فایل متنی از این کاراکتر استفاده نکینید ، بلکه در تمام سیستم عامل ها از نشانه یک کاراکتری "\n" استفاده کنید.

 



>>> os.linesep
'\r\n'

 

کار با file system در پایتون:

 دستور os.name، نام ماژول وابسته به سیستم عامل (میزبان) که import شده است را بر می گرداند که دارای مقادیر 'posix', 'nt', 'ce', 'java' می باشد.
 


>>> os.name
'nt'
برای آنکه بتوان اطلاعات دقیق تری درباره platform مورد استفاده بدست آورد، پس از import کردن ماژول sys، از رشته sys.platform استفاده می شود. برای سیستم عامل های مختلف این مقادیر به صورت زیر است:

سیستم

مقادیر platform

Linux

'linux'

Windows

'win32'

Windows/Cygwin

'cygwin'

Mac OS X

'darwin'

 
 

>>> import sys
>>> sys.platform
'win32'

برای آنکه مسیر دایرکتری کاری جاری را بدست آوریم از متد ()getcwd از ماژول os استفاده می شود که خروجی آن یک رشته است. سپس با استفاده از دستور listdir لیست کلیه فایل ها و دایرکتوری های موجود در این مسیر را بدست می آوریم. پارامتری که به این متد داده می شود، ممکن است از قبل تعریف شده باشد، و یا می توان از curdir که به معنای دایرکتوری جاری (current directory) است استفاده کرد. 
برای تغییر دایرکتوری فعلی به مسیر مورد نظر (path)، از متد chdir()path استفاده می شود، که در مثال زیر دایرکتری را به 'C:\\files'تغییر داده ایم. 
برای تغییر نام یک فایل نیز می توان از متد ()rename استفاده کرد. این متد دو پارامتر دریافت می کند که پارامتر اول نام فعلی (اولیه ) فایل است و ارامتر دوم  نام جدیدی است که قرار است بر روی فایل گذاشته شود.
 

>>> os.getcwd()
'C:\\Python27'
>>> os.listdir(os.curdir)
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'Scripts', 'share', 'tcl', 'Tools', 'w9xpopen.exe']
>>> os.chdir('C:\\files')
>>> os.getcwd()
'C:\\files'
>>> os.listdir(os.curdir)
['iso files', 'IT', 'ITIL.pdf', 'ride.docx', 'whatsnew.txt']
>>> os.rename('whatsnew.txt', 'pleaseRead.txt')
>>> os.listdir(os.curdir)
['iso files', 'IT', 'ITIL.pdf', 'pleaseRead.txt', 'ride.docx']

برای ایجاد فولدر جدید از متد mkdir() استفاده می شود و باید مسیر ایجاد دایرکتوری به آن داده شود. اگر به هنگام ایجاد دایرکتوری، فولدر دیگری با نام مشابه وجود داشته باشد، خطای FileExistsError رخ می دهد.
برای پاک کردن فایل ها می توان از دستور ()os.remove استفاده کرد. اگر مسیری که به عنوان ورودی به این متد داده می شود، مسیر یک فولدر باشد، خطای OSError رخ می دهد.
برای پاک کردن یک فولدر باید ابتدا تمام محتوای آن پاک شود و سپس خود فولدر پاک شود. سپس برای پاک کردن فولدر از دستور ()os.rmdir استفاده می شود.
 

>>> os.listdir(os.curdir)
['iso files', 'IT', 'ITIL.pdf', 'pleaseRead.txt', 'ride.docx']
>>> os.mkdir('moreFiles')


>>> os.mkdir('IT')

Traceback (most recent call last):
  File "", line 1, in 
    os.mkdir('IT')
WindowsError: [Error 183] Cannot create a file when that file already exists: 'IT'
>>> os.mkdir('deleteFiles')
>>> os.listdir(os.curdir)
['deleteFiles', 'iso files', 'IT', 'ITIL.pdf', 'moreFiles', 'pleaseRead.txt', 'ride.txt']
>>> os.remove('deleteFiles')

Traceback (most recent call last):
  File "", line 1, in 
    os.remove('deleteFiles')
WindowsError: [Error 5] Access is denied: 'deleteFiles'
>>> os.rmdir('deleteFiles')
>>> os.remove('ride.docx')
>>> os.listdir(os.curdir)
['iso files', 'IT', 'ITIL.pdf', 'moreFiles', 'pleaseRead.txt']

خواندن و نوشتن از فایل ها 
قبل از شروع استفاده از فایل باید یک نمونه از شیء فایل ساخت و فایل را باز کرد که بدین منظور از تابع open استفاده می شود و آن را به یک متغیر نسبت می دهیم . این تابع نیازمند دو پارامتر می‌باشد . پارامتر اول مسیر قرارگیری فایل را تعیین می‌کند. این مسیر می تواند مسیر کامل یا نسبی محل قرار گیری فایل و یا تنها نام فایل باشد.مسیر نسبی (relative path) از دایرکتوری جاری شروع می شود و مسیر کامل (absolute path) از بالاترین دایرکتوری سیستم فایل شروع می شود. اگر فایل مورد نظر در کنار برنامه پایتون در حال اجرا  قرار داشته باشد، نیاز به مسیردهی دقیق نیست در غیر اینصورت بایستی مسیر حقیقی فایل مشخص شود.
تابعexists  از ماژول path، وجود فایل یا دایرکتوری را در یک مسیر مشخص بررسی می کند.
 



>>> import os
>>> os.path.exists('c:/files/iso files')
True

پارامتر دوم mode می‌باشد . این پارامتر تعیین می‌کند که فایل چگونه استفاده خواهد شد . مودهای رایج برای استفاده عبارتند از:

مود ‘r’ (read) تنها برای خواندن .
مود ‘w’ (write) تنها برای نوشتن . در این حالت اگر فایل وجود نداشته باشد ایجاد خواهد شد و اگر فایل موجود باشد همه اطلاعات موجود حذف شده و اطلاعات جدید جایگزین می‌شود .
مود ‘a’ (append)برای اضافه کردن اطلاعات . اگر فایل وجود نداشته باشد ایجاد خواهد شد و اگر فایل موجود باشد اطلاعات جدید به انتهای اطلاعات قبلی اضافه خواهد شد .
مود ‘+r’ برای خواندن و نوشتن .

مود ‘b’ (binary) برای باز کردن فایل های دودویی ( باینری ) به کار می رود و امکان خواندن و نوشتن از این نوع فایل ها را می دهد. این مد هم چنین برای تمام فایل های غیر متنی مانند فایل های عکس، فایل های pdf و فایل پایگاه داده مورد استفاده قرار می گیرد.

لازم به ذکر است که  آرگومان دوم اختیاری است و اگر نادیده گرفته شود، "r" در نظر گرفته می شود. اما اگر فایلی وجود نداشته باشد و بخواهیم آن را برای پردازش باز کنیم، با خطا مواجه می شویم که چنین فایلی موجود نمی باشد.

در آخر با استفاده از تابع close باید فایل بسته شود تا منابع سیستم را آزاد شده و امکان استفاده سایر فرآیندها از فایل وجود داشته باشد.

برای نوشتن محتوا در فایل از تابع write() استفاده می شود. این تابع پس از اجرا مقدار None (در پایتون 2)  یا تعداد کاراکترهای نوشته شده در فایل (در چایتون 3) را برمی گرداند. در صورتی که بخواهیم مقداری غیر از رشته (string) در فایل نوشته شود، باید با استفاده از تابع str() آن را به رشته تبدیل کرد و در فایل نوشت.


>>> os.chdir('c:/files')
>>> os.listdir(os.curdir)
['iso files', 'IT', 'ITIL.pdf', 'moreFiles', 'pleaseRead.txt']

>>> f = open('testing.txt')

Traceback (most recent call last):
  File "", line 1, in 
    f = open('testing.txt')
IOError: [Errno 2] No such file or directory: 'testing.txt'
>>> f = open('testing.txt', 'w')
>>> f.write('The first line of text.\n')
>>> f.write('The second line of text.\n')
>>> f.close()


برای خواندن محتوای فایل از تابع read() استفاده می شود. این تابع پارامتر دلخواه size را دریافت می کند و مقداری از داده را به صورت رشته بر می گرداند. فرم کلی آن به صورت read(size) است. در این تابع اگر یک مقدار منفی به عنوان آرگومان دریافت کند و یا اصلا مقداری به عنوان آرگومان به آن داده نشود، کل محتوای فایل را خوانده و بر می گرداند (که البته در این صورت باید حافظه سیستم در نظر گرفته شود.) در غیر این صورت، حداکثر به اندازه size بایت از داده خوانده شده و برگردانده می شود. استفاده از این تابع برای خواندن فایل هایی که دارای حجم بزرگی هستند ممکن است باعث ایجاد مشکل شود.

تابع readline در هر بار فراخوانی، یک خط جدید از فایل را می‌خواند و یک کاراکتر "\n"  در انتهای رشته می گذارد. در صورتی که به خط اخر فایل رسیده باشیم، این کاراکتر دیده نمی شود زیرا خط جدیدی نیست که بخواهد آغاز شود. در صورتی که این متد یک رشته خالی را بر گرداند، به معنای آن است که به اخر فایل رسیده ایم و اگر خط خالی در فایل وجود داشته باشد، فقط کاراکتر "\n" باز گردانده خواهد شد.

 
 



>>> f = open('testing.txt')
>>> f.readline()
'The first line of text.\n'
>>> f.readline()
'The second line of text.\n'
>>> f.readline()
''
>>> f.seek(0)
>>> f.read()
'The first line of text.\nThe second line of text.\n'

هم چنین برای آنکه بتوان کل محتوای فایل را به طور یکجا خواند و آن را در یک لیست نگه داری کرد، از تابع readlines() برای شیء فایل مورد نظر استفاده می شود. این متد یک لیست شامل تمام خط های محتوی فایل را بر می گرداند و اغلب برای خواندن فایل های بزرگ مورد استفاده قرار می گیرد.

برای خواندن محتوای فایل، یکی از مناسب ترین روش ها آن است که محتوای فایل را به صورت یک iterator در نظر گرفته و با استفاده از حلقه for و تابع readline()خطوط فایل خوانده شود. این روش سریع و آسان باعث استفاده بهینه از حافظه می شود.

 


>>> for line in open('test.txt').readlines():
	print line.replace('\n', '')

	
Perl
Python
Erlang
Java
C#
C
C++
>>> 



برای آنکه بتوان دنباله ای از داده را در فایل نوشت، از writelines() استفاده می شود. منظور از دنباله می تواند هر نوع شیء باشد، برای مثال لیستی از رشته ها که به عنوان ورودی به تابع داده می شود. این تابع مقداری را بر نمی گرداند. این تابع ورودی ای را که به صورت یک رشته به آن داده می شود، به صورت یک رشته منفرد در نظر گرفته و در فایل می نویسد.

 




>>> nameList = ['Banana', 'Apple', 'Orange']
>>> f = open('testing.txt', 'w')
>>> f.write(nameList)

Traceback (most recent call last):
  File "", line 1, in 
    f.write(nameList)
TypeError: expected a character buffer object
>>> f.writelines(nameList)
>>> f.close()
>>> f = open('testing.txt')
>>> print (f.read())
BananaAppleOrange
>>> type(f.read())



 
مثالی دیگر:
 
 


>>> file = open('test.txt', 'w')
>>> seq = ['This is 1st line\n', 'This is 2nd line\n', 'This is 3rd line\n', 'This is 4th line\n']
>>> file.writelines(seq)
>>> file.close()
>>> file = open('test.txt', 'r')
>>> print (file.read())
This is 1st line
This is 2nd line
This is 3rd line
This is 4th line

>>> 


 
وقتی کل فایل خوانده می شود، اشاره گر به آخرین بیت فایل انتقال می یابد. بنابراین اگر با استفاده از تابع print بخواهیم مجددا کل فایل را خوانده و نشلن دهیم، رشته خالی نمایش داده می شود و به همین دلیل باید مجددا اشاره گر را reset کرد.
 
 


>>> print (f.read())

>>> f.seek(0)
>>> print (f.read())
The first line of text.
The second line of text.
>>> f.close()


تابع seek() در پایتون:

برای آنکه بتوان اشاره گر را به هر قسمتی از فایل که می خواهیم منتقل کنیم، از تابع seek() استفاده می شود. فرم کلی این تابع به صورت زیر می باشد که دو پارمتر دریافت می کند.

fileObject.seek(offset[, whence])

 پارامتر اول مکان اشاره گر read/ write را در فایل نشان می دهد. پارامتر دوم اختیاری بوده و به طور پیش فرض صفر می باشد و به این معناست که اشاره گر در ابتدای فایل قرار دارد. اگر 1 باشد یعنی اشاره گر در موقعیت فعلی فایل قرار دارد و اگر 2 باشد به این معناست که اشاره کر در انتهای فایل قرار دارد. تابع seek(0) اشاره گر را به ابتدای فایل می برد.

اگر بخواهیم بدانیم در یک مسیر چه فایل‌ها یا پوشه‌هایی وجود دارند یا بخواهیم لیستی از اسامی آنها را تهیه کنیم، می توان از متد walk() و ماژول glob استفاده کرد.

متد walk() در پایتون:

متد walk نام فایل ها را به صورت یک directory tree بیان می کند و امکان پیمایش درخت را به صورت بالا به پایین یا پایین به بالا فراهم می کند. این تابع مقداری را بر نمی گرداند و فرم کلی آن به صورت زیر است:

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

 در این تابع اگر پارامتر اختیاری topdown بیان نشود و یا مقدار آن True در نظر گرفته شود، دایرکتوری از بالا به پایین (top-down) اسکن می شود و اگر برابر False شود دایرکتوری به صورت پایین به بالا اسکن می شود و پارامتر اختیاری onerror اگر در نظر گرفته شود، خطاهای مربوط به پیمایش را نشان داده و یا در صورت بروز استثنا، پیمایش را متوقف می کند.

فرض کنید فولدر files در درایو C دارای فایل های زیر است و درون فولدر IT نیز تعدادی فایل وجود دارد.

 
 
learning python
 
 
 
 
learning python
 

چگونگی پیمایش در دایرکتوری:

 
برای پیمایش درون این دایرکتوری می توان به صورت زیر عمل کرد:
 
 


>>> for root, dirnames, filenames in os.walk(os.curdir):
	print '{0} has {1} files'.format(root, len(files))


. has 0 files
.\iso files has 0 files
.\IT has 0 files
.\moreFiles has 0 files



 
در این مثال منظور از root همان درایو C،منظور از dirnames دایرکتوری files (موجود در درایو )C و منظور ازمتغیر filenames در حلقه for شیءهای موجود در دایرکتوری است. هدف ا این قطعه کد آن است که فولدر های موجود در دایرکتوری files به همراه تعداد objectهای موجود در آنها نشان داده شود.
منظور از "." در خروخی بالا، مسیر جاری است.
 
 

ماژول glob:

 
وقتی در برنامه به دنبال لیستی از فایل ها در سیستم هستید که نام تمامی آنها از الگوی خاصی پیروی می کند، استفاده از ماژول globe مناسب است. برای مثال هنگامی که به دنبال لیستی از نامهای فایل ها هستید که همگی دارای extension مشخص، پیشوند خاص یا هر نوع رشته مشترکی در نام فایل هستند، می توان به جای نوشتن کد برای جستجو در محتوای دایرکتوری ، از این ماژول استفاده کرد. قوانین الگویی برای glob، regular expression ها نیستند، بلکه از قوانین استاندارد مربوز به مسیر در Unix استفاده می کنند.
اگر در الگویی که به تابع glob داده می شود، از کاراکتر "*" استفاده شود، این کاراکتر می تواند با صفر یا تعداد بیشتری کاراکتر در بخشی از نام تطبیق یابد. برای مثال الگوی "dir/*"  به معنای هر فایلی است که در بخش اول نام آن "dir/" وجود داشته باشد.
برای لیست کردن فایل هایی که در یک subdirectory قرار دارند، باید نام subdirectory در الگو آورده شود.
کاراکتر دیگری که می تواند مورد استفاده قرار گیرد، "?" است که با هر تک کاراکتری در نام فایل تطبیق می یابد. برای مثال دستور " dir/file?.txt" با نام هر فایلی که با "file" شروع شود و یک کاراکتر(از هر نوع) بعد از آن آورده شود و در نهایت به ".txt" خاتمه یابد، تطبیق می یابد.
اگر بخواهیم نام فایل دارای کاراکتری از نوع خاص (مثلا عدد یا حروف) باشد، به جای "?" می توان از رنجی از کاراکتر ها استفاده کرد. برای مثال عبارت [0-9] با هر عدد یک رقمی تطبیق می یابد و به جای آن می توان از [0123456789] هم استفاده کرد، برای مثال 'dir/*[0-9].*'
مثال 1: مثال زیر تمای فایل های متنی (دارای پسوند .txt)موجود در فورلدری با نام IT در دایرکتوری files را نشان می دهد.
 
 



>>> import glob
>>> glob.glob('c:/files/IT/*.txt')
['c:/files/IT\\IT 1.txt', 'c:/files/IT\\IT 2.txt', 'c:/files/IT\\IT 3.txt', 'c:/files/IT\\IT 5.txt', 'c:/files/IT\\IT4.txt']


 
مثال2: مثال زیر تمامی محتوای فولدر files را نشان می دهد:
 
 



>>> for name in glob.glob('c:/files/*'):
	print name

	
c:/files\iso files
c:/files\IT
c:/files\ITIL.pdf
c:/files\moreFiles
c:/files\pleaseRead.txt
c:/files\test.txt
c:/files\testing.txt

 
مثال 3: 
 
 



>>> for name in glob.glob('c:/files/moreFiles/f?.pptx'):
	print name

	
c:/files/moreFiles\f1.pptx
c:/files/moreFiles\f2.pptx
c:/files/moreFiles\fa.pptx
c:/files/moreFiles\fb.pptx
>>> 

مثال 4:
 
 



>>> for name in glob.glob('c:/files/moreFiles/*[0-9].*'):
	print name

	
c:/files/moreFiles\f1.pptx
c:/files/moreFiles\f2.pptx
c:/files/moreFiles\python1.txt
c:/files/moreFiles\web 3.pdf

 

ماژول pickle:

pickle یک ماژول از پیش ساخته شده در پایتون است که یک ذخیره سازی قابل حمل از داده های ساخت یافته را فراهم می کند. 
این ماژول می تواند یک شیء پیچیده را به جریانی از بایت ها(Pickling) یا بالعکس (Unpickling) تبدیل کند.به فرآیند pickling،serialization گویند زیرا داده را به صورت توالی ای از ارقام باینری تبدبل می کند، و به فرآیند unpickling، marshaling یا flattening گویند. ساده ترین کاری که می توان با این جریان از بایت ها انجام داد، نوشتن آنها در یک فایل متنی است اما می توان آنها را درون یک شبکه ارسال کرد یا در پایگاه داده ذخیره کرد.
این ماژول تقریبا تمامی نوع آبجکت هایی که برای پایتون تعریف شده اند (از جمله لیست، دیکشنری، فایل هایxml و فایل های JSON) را به رشته مناسب با آن برای ذخیره درون دیتابیس ترجمه کرده و رشته های ترجمه شده را به آبجکت های قبلی آن بر می گرداند. می توان از pickle برای ذخیره داده هایی به غیر از رشته در دیتابیس استفاده کرد.
برای serialize کردن سلسله مراتب داده از تابع ()dump در ماژول pickle استفاده می شود و برای بازسازی مجدد جریان داده از ()load استفاده می شود.
 
 
 
 



>>> a = ['fruit', 2323, 'test', 23.2342]
>>> import pickle
>>> f = open('c:/files/pick.txt', 'wb')
>>> pickle.dump(a,f)
>>> f.close()
>>> f2 = open('c:/files/pick.txt', 'r')
>>> a = pickle.load(f2)
>>> a
['fruit', 2323, 'test', 23.2342]
>>> 


 
هم چنین تابع pickle.dumps یک شیء را به عنوان پارامتر دریافت کرده و یک رشته متناظر با آن بر می گرداند( dumps کوتاه شده "dump string" می باشد).
فرمت رشته برگردانده شده واضح به نظر نخواهد رسید؛ این رشته جهت ساده شدن برای pickle جهت تفسیر یه این شکل در آمده است. برای بازسازی شیء از pickle.loads ("loads string") استفاده می شود. هرچند شیء جدید مقداری مشابه با شیء قدیمی دارد، ولی به طور کلی این دو شیء با یکدیگر یکی نخواهند بود، اما عملیات pickling و unpickling تأثیر یکسانی با کپی کردن یک شیء دارند.
 
 


>>> s = {1:'Sunday', 2:'Monday', 3:'Tuesday', 4:'Wednesday', 5:'Thursday', 6:'Friday', 7:'Saturday'}
>>> p = pickle.dumps(s)
>>> p
"(dp0\nI1\nS'Sunday'\np1\nsI2\nS'Monday'\np2\nsI3\nS'Tuesday'\np3\nsI4\nS'Wednesday'\np4\nsI5\nS'Thursday'\np5\nsI6\nS'Friday'\np6\nsI7\nS'Saturday'\np7\ns."
>>> l = pickle.loads(p)
>>> l
{1: 'Sunday', 2: 'Monday', 3: 'Tuesday', 4: 'Wednesday', 5: 'Thursday', 6: 'Friday', 7: 'Saturday'}
>>> s == l
True
>>> s is l
False




 
یکی از مشکلات pickle آن است که در آن security checking وجود ندارد بنابراین وقتی فایلی را با استفاده از مرورگر دانلود می کنید باید از قابل اطمینان بودن منبع آن مطمئن باشید.
 
 

فایل های غیر متنی در پایتون

نحوه کار با سایر فایل های غیر متنی در پایتون:

 
کتابخانه تصویری پایتون (Python Imaging Library) یا به اختصار PIL، شامل مجموعه ای از ماژول هاست که مهمترین کلاس در آن، کلاس Image می باشد که در ماژولی با همین نام تعریف شده است. (این کتابخانه مربوط به پایتون 2 می باشد) برای استفاده از این کلاس باید در ابتدا فایل PIL را دانلود کرده و نصب کرد. با استفاده از روش های مختلف از قبیل لود کردن یک تصویر از فایل، پردازش سایر تصاویر یا ایجاد تصاویر، نمونه ای از این کلاس را ایجاد می شود. برای load کردن یک تصویر از فایل، از تابع ()open در ماژول Image استفاده می شود. در صورتی که عملیات open() با موفقیت انجام شود، یک شیء Image برگردانده می شود و در صورتی که فایل نتواند باز شود، خطای IOError رخ می دهد. پس از باز کردن تصویر می توان از متدهای مختلف برای اعمال پردازش بر روی آن استفاده کرد. برای مثال برای نمایش تصویر می توان از تابع ()show استفاده کرد. PIL از دامنه وسیعی از فرمت های تصویر پشتیبانی می کند. برای بازکردن تصویر، نیازی به دانستن فرمت تصویر نیست، زیرا این کتابخانه به طور اتوماتیک براساس محتوای فایل فرمت آن را تعیین می کند. اما برای ذخیره تصویر، باید فرمت را تعیین کرد یزرا در غیر این صورت این کتابخانه از extension خود فایل برای ذخیره آن استفاده می کند (برای آگاهی بیشتر درباره متدهای فایل، به آدرس http://effbot.org/imagingbook/introduction.htm رجوع شود.)
 
 


>>> import Image
>>> dir(Image)
['ADAPTIVE', 'AFFINE', 'ANTIALIAS', 'BICUBIC', 'BILINEAR', 'CONTAINER', 'CUBIC', 'DEBUG', 'EXTENSION', 'EXTENT', 'FLIP_LEFT_RIGHT', 'FLIP_TOP_BOTTOM', 'FLOYDSTEINBERG', 'ID', 'Image', 'ImageMode', 'ImagePalette', 'ImagePointHandler', 'ImageTransformHandler', 'IntType', 'LINEAR', 'MESH', 'MIME', 'MODES', 'NEAREST', 'NONE', 'NORMAL', 'OPEN', 'ORDERED', 'PERSPECTIVE', 'QUAD', 'RASTERIZE', 'ROTATE_180', 'ROTATE_270', 'ROTATE_90', 'SAVE', 'SEQUENCE', 'StringType', 'TupleType', 'UnicodeStringType', 'VERSION', 'WEB', '_E', '_ENDIAN', '_ImageCrop', '_MAPMODES', '_MODEINFO', '_MODE_CONV', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_conv_type_shape', '_fromarray_typemap', '_getdecoder', '_getencoder', '_getscaleoffset', '_imaging_not_installed', '_initialized', '_show', '_showxv', '_wedge', 'blend', 'byteorder', 'composite', 'core', 'eval', 'fromarray', 'frombuffer', 'fromstring', 'getmodebandnames', 'getmodebands', 'getmodebase', 'getmodetype', 'init', 'isDirectory', 'isImageType', 'isNumberType', 'isSequenceType', 'isStringType', 'isTupleType', 'merge', 'new', 'open', 'os', 'preinit', 'register_extension', 'register_mime', 'register_open', 'register_save', 'string', 'sys', 'warnings']
>>> im = Image.open('c:/files/flowers.jpg')
>>> im.show()
>>> type(im)





 
برای کار با ماکروسافت آفیس در پایتون، به طور مشابه، می توان کتابخانه های پایتون برای ماکروسافت آفیس (Python library for working with Microsoft Office) مانند pywin32 را نصب کرده و از آنها استفاده کرد.
برای کار با فایل های pdf نیز می توان از کتابخانه های reportlab  و swfTools استفاده کرد. ماژول gfx در کتابخانه swfTools دارای پارسری برای کار با فایل های pdf می باشد که امکان استخراج متن از صفحات فایل pdf، ایجاد bitmap از آنها و یا تبدیل آنها به فایل swf را فراهم می کند. برای استفاده از این ماژول ابتدا باید swfTools را دانلود و نصب کرد و سپس با import کردن ماژول gfx از آن استفاده کرد. برای استفاده از ماژول gfx باید فایل را باز کرد که در این حال دو پارمتر نوع فایل ( که درباره فایل های pdf، pdf می باشد) و مسیر قرار گیری فایل به تابع ()open رسال می شود.
 
 


>>> import gfx
>>> doc = gfx.open('pdf', 'itil.pdf')



 
پس از باز کردن فایل pdf، سایر توابع آن را مانند getInfo، getPage و یا setParameter را می توان فراخوانی کرد. برای مثال تابع getInfo اطلاعات مفیدی درباره عنوان، موضوع، کلمات کلیدی، نویسنده و .. در اختیار می گذارد.
 
 
 
امیدواریم مطالب این قسمت مورد توجه شما قرار گرفته باشد
مجموعه ABLY

 

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس