GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||
GeezerVison is showing python.github.io — io --- ابزارهای اصلی برای کار با جریانها
|
ABC |
به ارث میبرد |
متدهای Stub |
متدها و ویژگیهای Mixin |
|---|---|---|---|
|
|
||
|
متدهای موروثی |
||
|
متدهای موروثی |
||
|
متدهای بهارثبردهشده از |
کلاس پایه انتزاعی برای تمام کلاسهای I/O.
این کلاس، پیادهسازیهای انتزاعی خالی برای بسیاری از متدها فراهم میکند که کلاسهای مشتقشده میتوانند آنها را بهصورت انتخابی بازنویسی کنند؛ پیادهسازیهای پیشفرض نشاندهنده پروندهای هستند که نمیتوان آن را خواند، نوشت یا مکانیابی (seek) کرد.
با وجود اینکه IOBase متدهای read() و write() را تعریف نمیکند، زیرا امضاهای آنها متفاوت خواهد بود، پیادهسازیها و کلاینتها باید آن متدها را بخشی از رابط بدانند. همچنین، پیادهسازیها ممکن است هنگام فراخوانی عملیاتی که پشتیبانی نمیشوند، یک ValueError (یا UnsupportedOperation) پرتاب کنند.
نوع پایهای که برای دادههای دودوییِ خواندهشده از پرونده یا نوشتهشده در پرونده به کار میرود، bytes است. سایر اشیاء شبهبایت نیز بهعنوان آرگومانهای متد پذیرفته میشوند. کلاسهای ورودی/خروجی متنی با دادههای str کار میکنند.
توجه داشته باشید که فراخوانی هر متد (حتی پرسوجوها) بر روی یک جریان بسته، تعریفنشده است. پیادهسازیها ممکن است در این حالت ValueError را پرتاب کنند.
IOBase (و زیرکلاسهای آن) از پروتکل پیمایشگر پشتیبانی میکند، به این معنا که میتوان بر روی یک شیء IOBase تکرار کرد و سطرهای یک جریان را به دست آورد. سطرهای بسته به اینکه جریان یک جریان دودویی باشد (که بایتها را به دست میدهد) یا یک جریان متنی (که رشتههای نویسهای را به دست میدهد)، کمی متفاوت تعریف میشوند. readline() را در زیر ببینید.
IOBase همچنین یک مدیر زمینه است و بنابراین از دستور with پشتیبانی میکند. در این مثال، file پس از پایان یافتن بدنهی دستور with بسته میشود—حتی اگر استثنایی رخ دهد:
with open('spam.txt', 'w') as file: file.write('Spam and eggs!')
IOBase این ویژگیهای داده و متدها را ارائه میدهد:
این جریان را تخلیه میکند و میبندد. اگر پرونده از قبل بسته باشد، این متد هیچ اثری ندارد. پس از بسته شدن پرونده، هر عملیاتی بر روی پرونده (مانند خواندن یا نوشتن) یک ValueError را پرتاب خواهد کرد.
برای سهولت، فراخوانی این متد بیش از یک بار مجاز است؛ با این حال، تنها اولین فراخوانی اثر خواهد داشت.
True اگر جریان بسته باشد.
توصیفگر پرونده (یک عدد صحیح) زیربنایی جریان را در صورت وجود برمیگرداند. اگر شیء IO از توصیفگر پرونده استفاده نکند، یک OSError پرتاب میشود.
در صورت امکان، بافرهای نوشتن جریان را تخلیه میکند. این کار برای جریانهای فقطخواندنی و غیرمسدودکننده هیچ کاری انجام نمیدهد.
اگر جریان تعاملی باشد (یعنی به یک پایانه/دستگاه tty متصل باشد)، True را برمیگرداند.
اگر بتوان از جریان خواند، True برمیگرداند. اگر False باشد، read() OSError را پرتاب میکند.
یک خط را از جریان میخواند و برمیگرداند. اگر size مشخص شده باشد، حداکثر size بایت خوانده خواهد شد.
پایاندهنده خط برای پروندههای دودویی همیشه b'\n' است؛ برای پروندههای متنی، میتوان از آرگومان newline در open() برای انتخاب پایاندهنده(های) خط شناساییشده استفاده کرد.
سطرها را از جریان میخواند و فهرستی از سطرها را برمیگرداند. میتوان hint را برای کنترل تعداد سطرهای خواندهشده مشخص کرد: اگر اندازهی کل تمام سطرهای تاکنون (بر حسب بایت/نویسه) از hint بیشتر شود، سطرهای بیشتری خوانده نخواهد شد.
مقادیر hint که 0 یا کمتر باشند، و همچنین None، بهعنوان بدون راهنما در نظر گرفته میشوند.
توجه داشته باشید که از قبل میتوان با استفاده از for line in file: ... روی اشیای پرونده پیمایش کرد، بدون فراخوانی file.readlines().
موقعیت جریان را به offset بایتی دادهشده تغییر میدهد، که نسبت به موقعیت مشخصشده توسط whence تفسیر میشود، و موقعیت مطلق جدید را برمیگرداند. مقادیر whence عبارتند از:
os.SEEK_SET یا 0 -- شروع جریان (پیشفرض)؛ offset باید صفر یا مثبت باشد
os.SEEK_CUR یا 1 -- موقعیت جاری جریان؛ offset میتواند منفی باشد
os.SEEK_END یا 2 -- پایان جریان؛ offset معمولاً منفی است
اضافه شده در نسخهی 3.1: ثابتهای SEEK_*.
اضافه شده در نسخهی 3.3: برخی سیستمعاملها ممکن است از مقادیر اضافی، مانند os.SEEK_HOLE یا os.SEEK_DATA پشتیبانی کنند. مقادیر معتبر برای یک پرونده ممکن است به این بستگی داشته باشد که پرونده در حالت متنی باز شده باشد یا دودویی.
اگر جریان از دسترسی تصادفی پشتیبانی کند، True برمیگرداند. اگر False باشد، seek()، tell() و truncate() استثنای OSError را پرتاب خواهند کرد.
موقعیت فعلی جریان را برمیگرداند.
جریان را به size دادهشده بر حسب بایت تغییر اندازه دهید (یا اگر size مشخص نشده باشد، به موقعیت فعلی). موقعیت فعلی جریان تغییر نمیکند. این تغییر اندازه میتواند اندازه فعلی پرونده را افزایش یا کاهش دهد. در صورت افزایش، محتوای بخش جدید پرونده به پلتفرم بستگی دارد (در بیشتر سیستمها، بایتهای اضافی با صفر پر میشوند). اندازه جدید پرونده برگردانده میشود.
تغییر یافته در نسخهی 3.5: اکنون ویندوز هنگام افزایش اندازهی پروندهها، آنها را با صفر پر میکند.
اگر جریان از نوشتن پشتیبانی کند، True را برمیگرداند. اگر False باشد، write() و truncate() استثنای OSError را پرتاب میکنند.
فهرستی از سطرها را در جریان بنویسید. جداکنندههای خط اضافه نمیشوند، بنابراین معمول است که هر یک از سطرهای ارائهشده، در انتهای خود یک جداکنندهی خط داشته باشد.
کلاس پایه برای جریانهای دودویی خام. این کلاس از IOBase ارث میبرد.
جریانهای دودویی خام معمولاً دسترسی سطح پایین به یک دستگاه یا API زیربنایی سیستمعامل را فراهم میکنند و تلاش نمیکنند آن را در ساختارهای اولیه سطح بالا کپسوله کنند (این قابلیت در سطح بالاتری در جریانهای دودویی بافرشده و جریانهای متنی انجام میشود، که بعداً در همین صفحه توضیح داده شدهاند).
RawIOBase این متدها را علاوه بر متدهای IOBase فراهم میکند:
حداکثر size بایت از شیء بخوانید و آنها را برگردانید. برای سهولت، اگر size مشخصنشده باشد یا -1 باشد، تمام بایتها تا EOF برگردانده میشوند.
تلاش میکند تنها یک فراخوانی سیستم انجام دهد، اما اگر قطع شود و مدیر سیگنال استثنا پرتاب نکند، دوباره تلاش میکند (برای چرایی این موضوع PEP 475 را ببینید). این بدان معناست که اگر فراخوانی سیستمعامل کمتر از size بایت برگرداند، ممکن است کمتر از size بایت برگردانده شود.
اگر ۰ بایت بازگردانده شود و size برابر ۰ نباشد، این پایان پرونده را نشان میدهد. اگر شیء در حالت غیرمسدودکننده باشد و هیچ بایتی در دسترس نباشد، None بازگردانده میشود.
پیادهسازی پیشفرض به readall() و readinto() ارجاع میدهد.
تمام بایتها را از جریانتا EOF بخوانید و برگردانید، در صورت لزوم با استفاده از چندین فراخوانی جریان.
اگر 0 بایت برگردانده شود، این نشاندهنده پایان پرونده است. اگر شیء در حالت غیرمسدودکننده (non-blocking) باشد و read() زیربنایی None را برگرداند که نشان میدهد هیچ بایتی در دسترس نیست، None برگردانده میشود.
بایتها را در یک bytes-like object از پیش تخصیصیافته و قابلنوشتن b میخواند و تعداد بایتهای خواندهشده را برمیگرداند. برای مثال، b ممکن است یک bytearray باشد.
اگر 0 بازگردانده شود و len(b) برابر 0 نباشد، این نشاندهنده پایان پرونده است. اگر شیء در حالت غیرمسدودکننده باشد و هیچ بایتی در دسترس نباشد، None بازگردانده میشود.
bytes-like object دادهشده، b، را در جریان خام زیرین مینویسد و تعداد بایتهای نوشتهشده را برمیگرداند. این مقدار، بسته به جزئیات جریان خام زیرین و بهویژه اگر در حالت غیرمسدودکننده باشد، میتواند کمتر از طول b بر حسب بایت باشد. اگر جریان خام بهگونهای تنظیم شده باشد که مسدود نکند و هیچ بایتی بهراحتی قابل نوشتن در آن نباشد، None برگردانده میشود. فراخواننده ممکن است پس از بازگشت این متد، b را آزاد کند یا تغییر دهد، بنابراین پیادهسازی باید تنها در حین فراخوانی متد به b دسترسی داشته باشد.
هشدار
این تابع تضمین نمیکند که همهی بایتها نوشته شوند یا استثنایی پرتاب شود. فراخوانندگان میتوانند آن رفتار را با بررسی مقدار بازگشتی پیادهسازی کنند و اگر این مقدار کمتر از طول b باشد، با حلقهای از فراخوانیهای write بیشتر، همهی بایتهای نوشتهنشده را بنویسند. اشیای سطح بالای I/O مانند ورودی/خروجی دودویی و ورودی/خروجی متنی رفتار تلاش مجدد را پیادهسازی میکنند.
کلاس پایه برای جریانهای دودویی که از نوعی بافرینگ (buffering) پشتیبانی میکنند. این کلاس از IOBase ارث میبرد.
تفاوت اصلی با RawIOBase این است که متدهای read()، readinto() و write() تلاش خواهند کرد (بهترتیب) تا ورودی را به اندازهی درخواستشده بخوانند یا تمام دادههای ارائهشده را خارج کنند.
علاوه بر این، اگر جریان خام زیربنایی در حالت غیرمسدودکننده باشد، هرگاه سیستم وضعیت would block را برگرداند، write() استثنا BlockingIOError را با BlockingIOError.characters_written پرتاب میکند و read() دادههای خواندهشده تاکنون را برمیگرداند، یا اگر دادهای در دسترس نباشد None برمیگرداند.
علاوه بر این، متد read() پیادهسازی پیشفرضی که به readinto() ارجاع دهد، ندارد.
یک پیادهسازی معمول BufferedIOBase نباید از یک پیادهسازی RawIOBase ارث ببرد، بلکه باید آن را بپوشاند، همانطور که BufferedWriter و BufferedReader این کار را انجام میدهند.
BufferedIOBase این ویژگیهای داده و متدها را علاوه بر موارد موجود در IOBase، ارائه میکند یا بازنویسی میکند:
جریان خام زیربنایی (یک نمونه از RawIOBase) که BufferedIOBase با آن سروکار دارد. این بخشی از API BufferedIOBase نیست و ممکن است در برخی پیادهسازیها وجود نداشته باشد.
جریان خام زیربنایی را از بافر جدا میکند و آن را برمیگرداند.
پس از جدا شدن جریان خام، بافر در وضعیت غیرقابلاستفاده است.
برخی بافرها، مانند BytesIO، مفهوم یک جریان خام واحد برای بازگرداندن از این متد را ندارند. آنها UnsupportedOperation را پرتاب میکنند.
اضافه شده در نسخهی 3.1.
حداکثر size بایت را میخواند و برمیگرداند. اگر آرگومان حذفشده باشد، None باشد یا منفی باشد، تا حد ممکن میخواند.
ممکن است بایتهای کمتری نسبت به تعداد درخواستشده بازگردانده شود. اگر جریان از قبل در EOF باشد، یک شیء bytes خالی بازگردانده میشود. ممکن است بیش از یک خواندن انجام شود و در صورت مواجهه با خطاهای خاص، فراخوانیها بازآزمایی شوند؛ برای جزئیات بیشتر os.read() و PEP 475 را ببینید. بازگردانده شدن کمتر از size بایت، به این معنا نیست که EOF قریبالوقوع است.
هنگام خواندن تا حد امکان، پیادهسازی پیشفرض در صورت در دسترس بودن از raw.readall استفاده میکند (که باید RawIOBase.readall() را پیادهسازی کند)، در غیر این صورت در یک حلقه میخواند تا زمانی که read None، یک bytes خالی، یا یک خطای غیرقابلتلاش مجدد را برگرداند. برای بیشتر جریانها، این فرآیند تا EOF ادامه دارد، اما برای جریانهای غیرمسدودکننده ممکن است دادههای بیشتری در دسترس قرار بگیرند.
نکته
هنگامی که جریان خام زیربنایی غیرمسدودکننده باشد، پیادهسازیها ممکن است در صورت در دسترس نبودن داده، BlockingIOError را پرتاب کنند یا None را برگردانند. پیادهسازیهای io مقدار None را برمیگردانند.
حداکثر تا size بایت را با فراخوانی readinto() میخواند و برمیگرداند؛ این متد ممکن است در صورت مواجهه با EINTR مطابق PEP 475 دوباره تلاش کند. اگر size برابر -1 باشد یا ارائه نشده باشد، پیادهسازی مقدار دلخواهی برای size انتخاب خواهد کرد.
نکته
هنگامی که جریان خام زیربنایی غیرمسدودکننده باشد، پیادهسازیها ممکن است در صورت در دسترس نبودن داده، BlockingIOError را پرتاب کنند یا None را برگردانند. پیادهسازیهای io مقدار None را برمیگردانند.
بایتها را در یک شیء شبهبایت (bytes-like object) از پیش تخصیصدادهشده و قابلنوشتن b میخواند و تعداد بایتهای خواندهشده را برمیگرداند. برای مثال، b ممکن است یک bytearray باشد.
مانند read()، ممکن است چندین عملیات خواندن به جریان خام زیرین صادر شود، مگر اینکه این جریان تعاملی باشد.
اگر جریان خام زیربنایی در حالت غیرمسدودکننده باشد و در حال حاضر دادهای در دسترس نداشته باشد، یک BlockingIOError پرتاب میشود.
بایتها را با استفاده از حداکثر یک فراخوانی متد read() (یا readinto()) جریان خام زیربنایی، در یک شیء شبهبایت b از پیش تخصیصیافته و قابل نوشتن بخوانید. تعداد بایتهای خواندهشده را برگردانید.
اگر جریان خام زیربنایی در حالت غیرمسدودکننده باشد و در حال حاضر دادهای در دسترس نداشته باشد، یک BlockingIOError پرتاب میشود.
اضافه شده در نسخهی 3.5.
bytes-like object دادهشده، b، را مینویسد و تعداد بایتهای نوشتهشده را برمیگرداند (همیشه برابر با طول b بر حسب بایت است، زیرا اگر نوشتن ناموفق باشد، یک OSError پرتاب میشود). بسته به پیادهسازی واقعی، این بایتها ممکن است بهراحتی در جریان زیرین نوشته شوند، یا به دلایل کارایی و تأخیر در یک بافر نگهداری شوند.
در حالت غیرمسدودکننده، اگر دادهای نیاز باشد در جریان خام نوشته شود اما جریان خام نتواند همهی دادهها را بدون مسدودسازی بپذیرد، استثنای BlockingIOError پرتاب میشود.
فراخواننده ممکن است b را پس از بازگشت این متد آزاد کند یا تغییر دهد، بنابراین پیادهسازی باید فقط در حین فراخوانی متد به b دسترسی داشته باشد.
یک جریان دودویی خام که نشاندهندهی پروندهای در سطح سیستمعامل حاوی دادههای بایتی است. این جریان از RawIOBase ارث میبرد و طراحی دسترسی سطح پایین آن را پیادهسازی میکند. این بدان معناست که write() تضمین نمیکند که همهی بایتها نوشته شوند و read() ممکن است بایتهای کمتری نسبت به تعداد درخواستشده بخواند، حتی اگر بایتهای بیشتری در پرونده زیرین موجود باشد. برای داشتن رفتار «نوشتن همه» و «حداقل خواندن»، از ورودی/خروجی دودویی استفاده کنید.
name میتواند یکی از دو مورد باشد:
یک رشته نویسهای یا شیء bytes که مسیر پروندهای را که باز خواهد شد نشان میدهد. در این حالت closefd باید True باشد (پیشفرض)؛ در غیر این صورت یک خطا پرتاب خواهد شد.
عدد صحیحی که شمارهی یک توصیفگر پرونده موجود در سطح سیستمعامل را نشان میدهد و شیء FileIO حاصل، دسترسی به آن را فراهم خواهد کرد. هنگامی که شیء FileIO بسته شود، این توصیفگر پرونده نیز بسته خواهد شد، مگر آنکه closefd روی False تنظیم شده باشد.
mode میتواند 'r'، 'w'، 'x' یا 'a' برای خواندن (پیشفرض)، نوشتن، ایجاد انحصاری یا الحاق باشد. اگر پرونده در زمان باز شدن برای نوشتن یا الحاق وجود نداشته باشد، ایجاد میشود؛ این پرونده در زمان باز شدن برای نوشتن کوتاه میشود. اگر پرونده در زمان باز شدن برای ایجاد از قبل وجود داشته باشد، FileExistsError پرتاب میشود. باز کردن پرونده برای ایجاد، مستلزم نوشتن است، بنابراین این حالت رفتاری مشابه 'w' دارد. برای امکانپذیر شدن خواندن و نوشتن همزمان، '+' را به حالت اضافه کنید.
میتوانید با گذراندن یک شیء فراخوانیپذیر بهعنوان opener از یک بازکننده سفارشی استفاده کنید. سپس توصیفگر پرونده زیربنایی برای شیء پرونده با فراخوانی opener با (name, flags) به دست میآید. opener باید یک توصیفگر پرونده باز را برگرداند (گذراندن os.open بهعنوان opener منجر به عملکردی مشابه گذراندن None میشود).
پرونده تازه ایجادشده غیرقابل ارثبردن است.
برای مثالهایی دربارهی استفاده از پارامتر opener، تابع توکار open() را ببینید.
هشدار
FileIO یک شیء ورودی/خروجی سطح پایین است و برای اعضایی مانند read() و write()، باید مقادیر بازگشتی آنها بهصورت صریح در یک حلقهی تلاش مجدد بررسی شوند تا رفتار «نوشتن همه» و «حداقل خواندن» پیادهسازی شود. اشیاء ورودی/خروجی سطح بالا ورودی/خروجی دودویی و ورودی/خروجی متنی رفتار تلاش مجدد را پیادهسازی میکنند.
تغییر یافته در نسخهی 3.3: پارامتر opener افزوده شد. حالت 'x' افزوده شد.
تغییر یافته در نسخهی 3.4: این پرونده اکنون غیرقابل ارثبردن است.
FileIO این ویژگیهای دادهای را علاوه بر ویژگیهای RawIOBase و IOBase ارائه میدهد:
حالت، همانطور که در سازنده داده شده است.
نام پرونده. هنگامی که در سازنده نامی داده نشده باشد، این مقدار توصیفگر پرونده است.
جریانهای ورودی/خروجی بافرشده، نسبت به ورودی/خروجی خام، رابط سطح بالاتری را برای یک دستگاه ورودی/خروجی فراهم میکنند.
یک جریان دودویی که از یک بافر بایت در حافظه استفاده میکند. این کلاس از BufferedIOBase ارث میبرد. هنگامی که متد close() فراخوانی شود، بافر دور انداخته میشود.
آرگومان اختیاری initial_bytes یک bytes-like object است که حاوی دادههای اولیه است.
متدها ممکن است در ساختهای نخآزاد بدون قفلگذاری خارجی از چندین نخ استفاده شوند.
BytesIO این متدها را علاوه بر متدهای BufferedIOBase و IOBase ارائه میدهد یا بازنویسی میکند:
یک نمای قابلخواندن و قابلنوشتن بر روی محتوای بافربرمیگرداند، بدون آنکه محتوا را کپی کند. همچنین، تغییر نما بهصورت شفاف محتوای بافر را بهروزرسانی میکند:
>>> b = io.BytesIO(b"abcdef") >>> view = b.getbuffer() >>> view[2:4] = b"56" >>> b.getvalue() b'ab56ef'
نکته
تا زمانی که نما وجود دارد، نمیتوان اندازهی شیء BytesIO را تغییر داد یا آن را بست.
اضافه شده در نسخهی 3.2.
در BytesIO، این همان read() است.
تغییر یافته در نسخهی 3.7: آرگومان size اکنون اختیاری است.
در BytesIO، این همان readinto() است.
اضافه شده در نسخهی 3.5.
یک جریان دودویی بافرشده که دسترسی سطح بالاتری به یک جریان دودویی خام RawIOBase خواندنی و غیرقابل مکانیابی فراهم میکند. این جریان از BufferedIOBase ارث میبرد.
هنگام خواندن داده از این شیء، ممکن است مقدار بیشتری داده از جریان خام زیربنایی درخواست شود و در یک بافر داخلی نگهداری شود. سپس دادههای بافریشده میتوانند مستقیماً در خواندنهای بعدی برگردانده شوند.
سازنده، یک BufferedReader را برای جریان raw قابلخواندن و buffer_size دادهشده ایجاد میکند. اگر buffer_size ذکر نشود، از DEFAULT_BUFFER_SIZE استفاده میشود.
BufferedReader علاوه بر متدهای BufferedIOBase و IOBase، این متدها را فراهم میکند یا بازنویسی مینماید:
بایتهایی از جریان را بدون پیش بردن موقعیت برمیگرداند. تعداد بایتهای برگرداندهشده ممکن است کمتر یا بیشتر از تعداد درخواستشده باشد. اگر جریان خام زیربنایی غیرمسدودکننده باشد و عملیات منجر به انسداد شود، بایتهای خالی برمیگرداند.
در BufferedReader، این همان io.BufferedIOBase.read() است
در BufferedReader، این همان io.BufferedIOBase.read1() است
تغییر یافته در نسخهی 3.7: آرگومان size اکنون اختیاری است.
یک جریان دودویی بافردار که دسترسی سطح بالاتری را به یک جریان دودویی خام قابل نوشتن و غیرقابل جستجو از نوع RawIOBase فراهم میکند. این کلاس از BufferedIOBase ارثبری میکند.
هنگام نوشتن در این شیء، دادهها معمولاً در یک بافر داخلی قرار میگیرند. این بافر در شرایط مختلف به شیء RawIOBase زیرین نوشته میشود، از جمله:
هنگامی که بافر برای همهی دادههای در انتظار بیش از حد کوچک شود؛
هنگامی که flush() فراخوانی میشود؛
هنگامی که یک seek() درخواست شود (برای اشیای BufferedRandom);
هنگامی که شیء BufferedWriter بسته یا نابود میشود.
سازنده یک BufferedWriter برای جریان raw قابلنوشتن دادهشده ایجاد میکند. اگر buffer_size داده نشود، مقدار پیشفرض آن DEFAULT_BUFFER_SIZE خواهد بود.
BufferedWriter این متدها را علاوه بر متدهای BufferedIOBase و IOBase فراهم میکند یا بازنویسی میکند:
بایتهای نگهداشتهشده در بافر را به جریان خام وارد کنید. اگر جریان خام مسدود شود، باید یک BlockingIOError پرتاب شود.
شیء شبهبایت، b را مینویسد و تعداد بایتهای نوشتهشده را برمیگرداند. در حالت غیرمسدودکننده، اگر نیاز باشد بافر نوشته شود اما جریان خام مسدود شود، استثنای BlockingIOError که BlockingIOError.characters_written آن تنظیم شده است، پرتاب میشود.
یک جریان دودویی بافرشده که رابطهای BufferedIOBase را پیادهسازی میکند و دسترسی سطح بالاتر به یک جریان دودویی خام قابل مکانیابی RawIOBase فراهم میکند.
سازنده یک خواننده و نویسنده برای جریان خام قابل مکانیابی دادهشده در اولین آرگومان ایجاد میکند. اگر buffer_size حذف شود، بهطور پیشفرض برابر با DEFAULT_BUFFER_SIZE خواهد بود.
BufferedRandom قادر است هر کاری را که BufferedReader یا BufferedWriter میتوانند انجام دهند، انجام دهد. علاوه بر این، پیادهسازی seek() و tell() تضمین شده است.
یک جریان دودویی بافرشده که دسترسی سطح بالاتری به دو جریان دودویی خام غیرقابل جستجو (non-seekable) از RawIOBase فراهم میکند — یکی قابل خواندن و دیگری قابل نوشتن. این کلاس از BufferedIOBase ارث میبرد.
reader و writer اشیاء RawIOBase هستند که بهترتیب قابل خواندن و قابل نوشتن میباشند. اگر buffer_size ذکر نشود، مقدار پیشفرض آن DEFAULT_BUFFER_SIZE خواهد بود.
BufferedRWPair همه متدهای BufferedIOBase را پیادهسازی میکند، بهجز detach() که UnsupportedOperation را پرتاب میکند.
هشدار
BufferedRWPair تلاش نمیکند دسترسیها به جریانهای خام زیربنایی خود را همگامسازی کند. نباید یک شیء یکسان را بهعنوان خواننده و نویسنده به آن بدهید؛ در عوض از BufferedRandom استفاده کنید.
کلاس پایه برای جریانهای متنی. این کلاس یک رابط مبتنی بر نویسه و خط برای ورودی/خروجی جریان فراهم میکند. این کلاس از IOBase ارث میبرد.
TextIOBase این ویژگیهای داده و متدها را علاوه بر موارد موجود در IOBase ارائه میدهد یا بازنویسی میکند:
نام کدگذاریای که برای کدگشایی بایتهای جریان به رشتهها و کدگذاری رشتهها به بایتها استفاده میشود.
تنظیم خطای کدگشا یا کدگذار.
یک رشته، یک تاپل از رشتهها، یا None، که نشاندهندهی سطرهای جدیدی است که تاکنون ترجمه شدهاند. بسته به پیادهسازی و پرچمهای اولیهی سازنده، ممکن است این در دسترس نباشد.
بافر دودویی زیربنایی (یک نمونه از BufferedIOBase یا RawIOBase) که TextIOBase با آن سروکار دارد. این بخشی از API TextIOBase نیست و ممکن است در برخی پیادهسازیها وجود نداشته باشد.
بافر دودویی زیربنایی را از TextIOBase جدا میکند و آن را برمیگرداند.
پس از جدا شدن بافر زیرین، TextIOBase در وضعیت غیرقابلاستفاده قرار میگیرد.
برخی از پیادهسازیهای TextIOBase، مانند StringIO، ممکن است مفهوم یک بافرزیرین را نداشته باشند و فراخوانی این متد موجب پرتاب UnsupportedOperation میشود.
اضافه شده در نسخهی 3.1.
حداکثر size نویسه را از جریان بهصورت یک str واحد میخواند و برمیگرداند. اگر size منفی یا None باشد، تا EOF میخواند.
تا خط جدید یا EOF میخواند و یک str واحد برمیگرداند. اگر جریان از قبل در EOF باشد، یک رشته خالی برگردانده میشود.
اگر size تعیین شده باشد، حداکثر size نویسه خوانده خواهد شد.
موقعیت جریان را به offset دادهشده تغییر میدهد. رفتار به پارامتر whence بستگی دارد. مقدار پیشفرض برای whence، SEEK_SET است.
SEEK_SET یا 0: جابهجایی از ابتدای جریان (پیشفرض)؛ offset باید یا عددی باشد که توسط TextIOBase.tell() برگردانده شده است، یا صفر. هر مقدار دیگری برای offset رفتار تعریفنشدهای ایجاد میکند.
SEEK_CUR یا 1: «جستجو» (seek) به موقعیت جاری؛ offset باید صفر باشد، که یک عملیات بدون اثر است (تمام مقادیر دیگر پشتیبانی نمیشوند).
SEEK_END یا 2: به انتهای جریان بروید؛ offset باید صفر باشد (تمام مقادیر دیگر پشتیبانی نمیشوند).
موقعیت مطلق جدید را بهعنوان یک عدد غیرشفاف برمیگرداند.
اضافه شده در نسخهی 3.1: ثابتهای SEEK_*.
موقعیت جاری جریان را بهعنوان یک عدد غیرشفاف برمیگرداند. این عدد معمولاً نشاندهندهی تعدادی بایت در فضای ذخیرهسازی دودویی زیرین نیست.
رشتهی s را در جریان مینویسد و تعداد نویسههای نوشتهشده را برمیگرداند.
یک جریان متنی بافرشده که دسترسی سطح بالاتری به یک جریان دودویی بافرشده از BufferedIOBase فراهم میکند. این جریان از TextIOBase ارثبری میکند.
encoding نام کدگذاریای را مشخص میکند که جریان با آن رمزگشایی یا رمزگذاری خواهد شد. این مقدار بهطور پیشفرض UTF-8 است؛ اگر UTF-8 Mode غیرفعال باشد، بهطور پیشفرض از locale.getencoding() استفاده میکند. برای مشخص کردن صریح کدگذاری locale فعلی میتوانید از encoding="locale" استفاده کنید. برای اطلاعات بیشتر کدگذاری متن را ببینید.
errors رشتهای اختیاری است که چگونگی مدیریت خطاهای کدگذاری و کدگشایی را مشخص میکند. برای پرتاب استثنای ValueError در صورت بروز خطای کدگذاری، 'strict' را ارسال کنید (مقدار پیشفرض None نیز همین اثر را دارد)، یا برای نادیده گرفتن خطاها، 'ignore' را ارسال کنید. (توجه داشته باشید که نادیده گرفتن خطاهای کدگذاری میتواند منجر به از دست رفتن داده شود.) 'replace' باعث میشود یک نشانگر جایگزینی (مانند '?') در جایی که داده نادرست وجود دارد درج شود. 'backslashreplace' باعث میشود داده نادرست با یک دنباله خنثیسازی حاوی بکاسلش جایگزین شود. هنگام نوشتن، میتوان از 'xmlcharrefreplace' (جایگزینی با ارجاع نویسه مناسب XML) یا 'namereplace' (جایگزینی با دنبالههای خنثیسازی \N{...}) استفاده کرد. هر نام مدیریت خطای دیگری که با codecs.register_error() ثبتشده باشد نیز معتبر است.
newline نحوه مدیریت پایان سطرها را کنترل میکند. این پارامتر میتواند None، ''، '\n'، '\r' و '\r\n' باشد. این پارامتر بهصورت زیر عمل میکند:
هنگام خواندن ورودی از جریان، اگر newline برابر None باشد، حالت سطرهای جدید همگانی (universal newlines) فعال میشود. سطرهای موجود در ورودی میتوانند با '\n'، '\r' یا '\r\n' به پایان برسند، و این موارد پیش از بازگشت به فراخواننده به '\n' تبدیل میشوند. اگر newline برابر '' باشد، حالت سطرهای جدید همگانی (universal newlines) فعال میشود، اما پایان سطرهای بدون تبدیل به فراخواننده بازگردانده میشود. اگر newline هر یک از مقادیر مجاز دیگر را داشته باشد، سطرهای ورودی فقط با رشته دادهشده به پایان میرسند و پایان خط بدون تبدیل به فراخواننده بازگردانده میشود.
هنگام نوشتن خروجی در جریان، اگر newline برابر None باشد، همه نویسههای '\n' نوشتهشده به جداکننده خط پیشفرض سیستم، os.linesep، تبدیل میشوند. اگر newline برابر '' یا '\n' باشد، هیچ تبدیلی صورت نمیگیرد. اگر newline هر یک از دیگر مقادیر مجاز باشد، همه نویسههای '\n' نوشتهشده به رشته دادهشده تبدیل میشوند.
اگر line_buffering برابر True باشد، هنگامی که یک فراخوانی write شامل یک نویسه خط جدید یا بازگشت به ابتدای سطر باشد، flush() بهطور ضمنی فراخوانی میشود.
اگر write_through برابر True باشد، تضمین میشود که فراخوانیهای write() در بافر نگهداری نمیشوند: هر دادهای که روی شیء TextIOWrapper نوشته شود، بلافاصله به buffer دودویی زیرین آن منتقل میشود.
تغییر یافته در نسخهی 3.3: آرگومان write_through اضافه شده است.
تغییر یافته در نسخهی 3.3: کدگذاری پیشفرض اکنون locale.getpreferredencoding(False) است، بهجای locale.getpreferredencoding(). کدگذاری locale را بهطور موقت با locale.setlocale() تغییر ندهید؛ بهجای کدگذاری ترجیحی کاربر، از کدگذاری locale فعلی استفاده کنید.
تغییر یافته در نسخهی 3.10: آرگومان encoding اکنون از نام کدگذاری ساختگی "locale" پشتیبانی میکند.
نکته
هنگامی که جریان خام زیربنایی غیرمسدودکننده باشد، اگر یک عملیات خواندن نتواند بلافاصله کامل شود، ممکن است یک BlockingIOError پرتاب شود.
TextIOWrapper علاوه بر مواردِ TextIOBase و IOBase، این ویژگیهای دادهای و متدها را فراهم میکند:
اینکه بافرینگ سطری (line buffering) فعال است یا خیر.
اینکه آیا نوشتارها بلافاصله به بافر دودویی زیرین ارسال میشوند.
اضافه شده در نسخهی 3.7.
این جریان متنی را با استفاده از تنظیمات جدید برای encoding، errors، newline، line_buffering و write_through بازپیکربندی کنید.
پارامترهای مشخصنشده، تنظیمات فعلی را حفظ میکنند، بهجز وقتی که encoding مشخص شده باشد اما errors مشخص نشده باشد؛ در این صورت از errors='strict' استفاده میشود.
اگر پیشتر مقداری داده از جریان خوانده شده باشد، تغییر کدگذاری یا خط جدید ممکن نیست. از سوی دیگر، تغییر کدگذاری پس از نوشتن ممکن است.
این متد پیش از تنظیم پارامترهای جدید، جریان را بهصورت ضمنی تخلیه میکند.
اضافه شده در نسخهی 3.7.
تغییر یافته در نسخهی 3.11: این متد از گزینهی encoding="locale" پشتیبانی میکند.
موقعیت جریان را تنظیم میکند. موقعیت جدید جریان را بهعنوان یک int برمیگرداند.
چهار عملیات پشتیبانی میشود که با ترکیبهای آرگومان زیر مشخص میشوند:
seek(0, SEEK_SET): به ابتدای جریان بازمیگردد.
seek(cookie, SEEK_SET): بازگرداندن موقعیت قبلی؛ cookie باید عددی باشد که tell() آن را برمیگرداند.
seek(0, SEEK_END): پرش سریع به انتهای جریان.
seek(0, SEEK_CUR): موقعیت فعلی جریان را بدون تغییر باقی میگذارد.
هر ترکیب دیگری از آرگومانها نامعتبر است و ممکن است استثناهایی را پرتاب کند.
همچنین ببینید
جریان متنی که از یک بافر متنی در حافظه استفاده میکند. این جریان از TextIOBase ارث میبرد.
بافر متنی هنگام فراخوانی متد close() دور ریخته میشود.
مقدار اولیهی بافر را میتوان با ارائهی initial_value تنظیم کرد. اگر ترجمهی خط جدید فعال باشد، نویسههای خط جدید طوری کدگذاری میشوند که گویی توسط write() کدگذاری شدهاند. جریان در ابتدای بافر قرار میگیرد؛ این حالت، باز کردن یک پرونده موجود در حالت w+ را شبیهسازی میکند و جریان را برای نوشتن فوری از ابتدا یا برای نوشتنی که مقدار اولیه را بازنویسی میکند، آماده میسازد. برای شبیهسازی باز کردن یک پرونده در حالت a+ که برای افزودن آماده است، از f.seek(0, io.SEEK_END) برای تغییر موقعیت جریان به انتهای بافر استفاده کنید.
آرگومان newline مانند آرگومان newline در TextIOWrapper عمل میکند، با این تفاوت که هنگام نوشتن خروجی در جریان، اگر newline برابر None باشد، سطرهای جدید بهصورت \n در همهی سکوها نوشته میشوند.
StringIO این متد را علاوه بر متدهای TextIOBase و IOBase ارائه میدهد:
یک str حاوی تمام محتوای بافر را برمیگرداند. کدگشایی سطرهای جدید گویی با read() انجام میشود، هرچند موقعیت جریان تغییر نمیکند.
نمونه استفاده:
import io output = io.StringIO() output.write('First line.\n') print('Second line.', file=output) # Retrieve file contents -- this will be # 'First line.\nSecond line.\n' contents = output.getvalue() # Close object and discard memory buffer -- # .getvalue() will now raise an exception. output.close()
یک کدک کمکی که سطرهای جدید را برای حالت سطرهای جدید جهانشمول (universal newlines) کدگشایی میکند. این کدک از codecs.IncrementalDecoder ارث میبرد.
پروتکلهای زیر میتوانند برای حاشیهنویسی آرگومانهای تابع و متد در عملیات سادهی خواندن یا نوشتن جریان استفاده شوند. این پروتکلها با @typing.runtime_checkable آراسته شدهاند.
پروتکل عام برای خواندن از یک پرونده یا جریان ورودی دیگر. T معمولاً str یا bytes خواهد بود، اما میتواند هر نوعی باشد که از جریان خوانده میشود.
اضافه شده در نسخهی 3.14.
داده را از جریان ورودی میخواند و آن را برمیگرداند. اگر size مشخص شده باشد، باید عدد صحیح باشد و حداکثر size آیتم (بایت/نویسه) خوانده میشود.
برای مثال:
def read_it(reader: Reader[str]): data = reader.read(11) assert isinstance(data, str)
پروتکل عام برای نوشتن در یک پرونده یا جریان خروجی دیگر. T معمولاً str یا bytes خواهد بود، اما میتواند هر نوعی باشد که بتوان آن را در جریان نوشت.
اضافه شده در نسخهی 3.14.
data را در جریان خروجی مینویسد و تعداد آیتمهای نوشتهشده (بایتها/نویسهها) را برمیگرداند.
برای مثال:
def write_binary(writer: Writer[bytes]): writer.write(b"Hello world!\n")
برای سایر پروتکلها و کلاسهای مرتبط با I/O که میتوانند برای بررسی ایستای نوع استفاده شوند، ABCها و پروتکلها برای کار با I/O را ببینید.
این بخش به بررسی کارایی پیادهسازیهای عینی ورودی/خروجی (I/O) ارائهشده میپردازد.
با خواندن و نوشتن فقط تکههای بزرگ داده، حتی زمانی که کاربر یک بایت واحد را درخواست میکند، ورودی/خروجی بافرشده هرگونه ناکارآمدی را در فراخوانی و اجرای روتینهای ورودی/خروجی بدون بافر سیستمعامل پنهان میکند. این بهره به سیستمعامل و نوع ورودی/خروجیای که انجام میشود بستگی دارد. برای مثال، در برخی سیستمعاملهای مدرن مانند لینوکس، ورودی/خروجی دیسک بدون بافر میتواند به اندازه ورودی/خروجی بافرشده سریع باشد. با این حال، نتیجه نهایی این است که ورودی/خروجی بافرشده، صرفنظر از پلتفرم و دستگاه پشتیبان، عملکردی قابل پیشبینی ارائه میدهد. بنابراین، برای دادههای دودویی، تقریباً همیشه ترجیح داده میشود که بهجای ورودی/خروجی بدون بافر از ورودی/خروجی بافرشده استفاده شود.
ورودی/خروجی متنی روی یک فضای ذخیرهسازی دودویی (مانند پرونده) بهمراتب کندتر از ورودی/خروجی دودویی روی همان فضای ذخیرهسازی است، زیرا به تبدیل بین دادههای یونیکد و دودویی با استفاده از یک کدک نویسهای نیاز دارد. این موضوع میتواند هنگام کار با حجم زیادی از دادههای متنی، مانند پروندههای گزارش بزرگ، محسوس شود. همچنین tell() و seek() هر دو به دلیل الگوریتم بازسازی بهکاررفته کاملاً کند هستند.
با این حال، StringIO یک ظرف یونیکد بومی درونحافظهای است و سرعتی مشابه BytesIO خواهد داشت.
اشیای FileIO تا حدی نخایمن هستند که فراخوانیهای سیستمعاملی که این اشیاء پوشش میدهند (مانند read(2) در یونیکس) نیز نخایمن باشند.
اشیای دودویی بافرشده (نمونههای BufferedReader، BufferedWriter، BufferedRandom و BufferedRWPair) ساختارهای داخلی خود را با استفاده از یک قفل محافظت میکنند؛ بنابراین فراخوانی آنها از چندین نخ بهصورت همزمان ایمن است.
اشیای TextIOWrapper نخایمن نیستند.
اشیای بافرشدهی دودویی (نمونههایی از BufferedReader، BufferedWriter، BufferedRandom و BufferedRWPair) بازورودپذیر نیستند. اگرچه فراخوانیهای بازورودپذیر در شرایط عادی رخ نمیدهند، اما ممکن است در اثر انجام I/O در یک هندلر سیگنال از signal پیش بیایند. اگر یک نخ تلاش کند به یک شیء بافرشده که هماکنون در حال دسترسی به آن است دوباره وارد شود، یک RuntimeError پرتاب میشود. توجه داشته باشید که این موضوع یک نخ دیگر را از ورود به شیء بافرشده باز نمیدارد.
مورد بالا بهطور ضمنی به پروندههای متنی نیز تعمیم مییابد، زیرا تابع open() یک شیء بافرشده را درون یک TextIOWrapper قرار میدهد. این موضوع شامل جریانهای استاندارد نیز میشود و بنابراین تابع توکار print() را نیز تحت تأثیر قرار میدهد.