آموزش زبان برنامه نویسی پایتون#جلسه هشتم
بسم الله الرحمن الرحیم
جلسه هشتم آموزش پایتون
مدیریت فایل در پایتون
بسم الله الرحمن الرحیم
جلسه هشتم
مدیریت فایل در پایتون
>>> 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) باشد. توجه کنید که خروجی این دستور یک لیست است و محتوا درون براکت نمایش داده می شود. خروجی نمایش داده شده توسط این دستور شامل فایل های خاص که دارای "." یا ".." می باشد، نیست، مگر آنکه این فایل ها درون دایرکتوری نمایش داده شده باشند.
>>> 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
'nt'
سیستم |
مقادیر platform |
---|---|
Linux |
'linux' |
Windows |
'win32' |
Windows/Cygwin |
'cygwin' |
Mac OS X |
'darwin' |
>>> import sys
>>> sys.platform
'win32'
>>> 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']
>>> 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']
>>> 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 (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 نیز تعدادی فایل وجود دارد.
چگونگی پیمایش در دایرکتوری:
>>> 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
ماژول glob:
>>> 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']
>>> 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
>>> 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
>>>
>>> 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:
>>> 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]
>>>
>>> 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
فایل های غیر متنی در پایتون
نحوه کار با سایر فایل های غیر متنی در پایتون:
>>> 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)
>>> import gfx
>>> doc = gfx.open('pdf', 'itil.pdf')