io --- ابزارهای اصلی برای کار با جریانها¶
کد منبع: Lib/io.py
نمای کلی¶
ماژول io امکانات اصلی پایتون را برای کار با انواع مختلف ورودی/خروجی (I/O) فراهم میکند. سه نوع اصلی ورودی/خروجی وجود دارد: ورودی/خروجی متنی، ورودی/خروجی دودویی و ورودی/خروجی خام. اینها دستهبندیهای کلی هستند و میتوان برای هر یک از آنها از ذخیرهسازهای پشتیبان (backing stores) مختلفی استفاده کرد. به هر شیء عینی که به یکی از این دستهها تعلق داشته باشد، شیء پرونده گفته میشود. سایر اصطلاحات رایج عبارتاند از جریان و شیء شبهپرونده (file-like object).
صرفنظر از دستهاش، هر شیء جریان مشخص همچنین قابلیتهای مختلفی خواهد داشت: میتواند فقط خواندنی، فقط نوشتنی، یا خواندنی-نوشتنی باشد. همچنین میتواند دسترسی تصادفی دلخواه (مکانیابی به جلو یا عقب به هر موقعیت) یا فقط دسترسی ترتیبی را مجاز بداند (برای مثال در مورد سوکتیا پایپ ).
همهی جریانها نسبت به نوع دادهای که به آنها میدهید حساس هستند. برای مثال، دادن یک شیء str به متد write() یک جریان دودویی باعث پرتاب یک TypeError میشود. همچنین دادن یک شیء bytes به متد write() یک جریان متنی نیز همینطور است.
تغییر یافته در نسخهی 3.3: عملیاتهایی که پیشتر IOError را پرتاب میکردند، اکنون OSError را پرتاب میکنند، زیرا IOError اکنون نام مستعاری از OSError است.
ورودی/خروجی متنی¶
ورودی/خروجی متنی، اشیای str را انتظار دارد و تولید میکند. این بدان معناست که هرگاه ذخیرهگاه پشتیبان بهطور ذاتی از بایتها تشکیل شده باشد (مانند یک پرونده)، کدگذاری و کدگشایی دادهها بهصورت شفاف انجام میشود و تبدیل اختیاری نویسههای خط جدید خاص هر پلتفرم نیز صورت میگیرد.
سادهترین راه برای ایجاد یک جریان متنی، استفاده از open() است، با تعیین اختیاری یک کدگذاری:
f = open("myfile.txt", "r", encoding="utf-8")
جریانهای متنی درونحافظهای نیز بهعنوان اشیای StringIO در دسترس هستند:
f = io.StringIO("some initial text data")
توجه
هنگام کار با یک جریان غیرمسدود، توجه داشته باشید که اگر جریان نتواند عملیات را بلافاصله انجام دهد، عملیاتهای خواندن روی اشیای ورودی/خروجی متنی ممکن است یک BlockingIOError را پرتاب کنند.
API جریان متن بهتفصیل در مستندات TextIOBase توضیح داده شده است.
ورودی/خروجی دودویی¶
ورودی/خروجی دودویی (که به آن ورودی/خروجی بافرشده نیز گفته میشود) اشیاء شبهبایت را میپذیرد و اشیای bytes را تولید میکند. هیچگونه کدگذاری، کدگشایی یا تبدیل نویسههای خط جدید انجام نمیشود. میتوان از این دسته از جریانها برای تمام انواع دادههای غیرمتنی استفاده کرد، و همچنین زمانی که کنترل دستی بر مدیریت دادههای متنی مورد نظر باشد.
سادهترین راه برای ایجاد یک جریان دودویی، استفاده از open() با 'b' در رشتهی حالت است:
f = open("myfile.jpg", "rb")
جریانهای دودویی درونحافظه نیز بهعنوان اشیای BytesIO در دسترس هستند:
f = io.BytesIO(b"some initial binary data: \x00\x01")
API جریان دودویی بهتفصیل در مستندات BufferedIOBase شرح داده شده است.
سایر ماژولهای کتابخانهای ممکن است روشهای بیشتری برای ایجاد جریانهای متنی یا دودویی فراهم کنند. برای مثال socket.socket.makefile() را ببینید.
ورودی/خروجی خام¶
ورودی/خروجی خام (که به آن ورودی/خروجی بدون بافر نیز گفته میشود) معمولاً بهعنوان یک جزء سازندهی سطح پایین برای جریانهای دودویی و متنی استفاده میشود؛ بهندرت دستکاری مستقیم یک جریان خام از طریق کد کاربر مفید است. با این حال، میتوانید با باز کردن یک پرونده در حالت دودویی در حالی که بافر غیرفعال است، یک جریان خام ایجاد کنید:
f = open("myfile.jpg", "rb", buffering=0)
API جریان خام بهطور کامل در مستندات RawIOBase شرح داده شده است.
هشدار
I/O خام یک رابط سطح پایین است و متدها معمولاً باید مقادیر بازگشتیشان بررسی شوند و بهصراحت دوباره فراخوانی شوند تا از تکمیل یک عملیات اطمینان حاصل شود. برای مثال، write() تعداد بایتهای نوشتهشده را برمیگرداند که ممکن است کمتر از تعداد بایتهای ارائهشده باشد (یک نوشتن جزئی). اشیاء I/O سطح بالا مانند ورودی/خروجی دودویی و ورودی/خروجی متنی رفتار تلاش مجدد را پیادهسازی میکنند.
کدگذاری متن¶
کدگذاری پیشفرض TextIOWrapper و open() وابسته به locale است (locale.getencoding()).
با این حال، بسیاری از توسعهدهندگان فراموش میکنند هنگام باز کردن پروندههای متنی کدگذاریشده با UTF-8 (مانند JSON، TOML، Markdown و غیره...) کدگذاری را مشخص کنند، زیرا بیشتر پلتفرمهای یونیکسی بهطور پیشفرض از تنظیمات locale با کدگذاری UTF-8 استفاده میکنند. این موضوع باعث ایجاد باگ میشود، زیرا کدگذاری تنظیمات locale برای بیشتر کاربران ویندوز UTF-8 نیست. برای مثال:
# May not work on Windows when non-ASCII characters in the file.
with open("README.md") as f:
long_description = f.read()
بنابراین، بهشدت توصیه میشود که هنگام باز کردن پروندههای متنی، کدگذاری را بهصراحت مشخص کنید. اگر میخواهید از UTF-8 استفاده کنید، encoding="utf-8" را ارسال کنید. برای استفاده از کدگذاری locale جاری، encoding="locale" از پایتون 3.10 به بعد پشتیبانی میشود.
همچنین ملاحظه نمائید
- حالت UTF-8 پایتون
میتوان از حالت UTF-8 پایتون برای تغییر کدگذاری پیشفرض از کدگذاری وابسته به locale به UTF-8 استفاده کرد.
- PEP 686
پایتون 3.15، حالت UTF-8 پایتون را پیشفرض خواهد کرد.
فعالسازی اختیاری هشدار کدگذاری (EncodingWarning)¶
اضافه شده در نسخهی 3.10: برای جزئیات بیشتر، PEP 597 را ببینید.
برای یافتن اینکه کدگذاری پیشفرض locale کجا استفاده میشود، میتوانید گزینهی خط فرمان -X warn_default_encoding را فعال کنید یا متغیر محیطی PYTHONWARNDEFAULTENCODING را تنظیم کنید، که هنگام استفاده از کدگذاری پیشفرض، یک EncodingWarning نشان میدهد.
اگر یک API ارائه میدهید که از open() یا TextIOWrapper استفاده میکند و encoding=None را بهعنوان یک پارامتر ارسال میکند، میتوانید از text_encoding() استفاده کنید تا فراخوانندگان آن API در صورتی که encoding را ارسال نکنند، یک EncodingWarning نشان میدهند. با این حال، لطفاً برای APIهای جدید استفاده از UTF-8 بهصورت پیشفرض (یعنی encoding="utf-8") را در نظر بگیرید.
رابط سطحبالای ماژول¶
- io.DEFAULT_BUFFER_SIZE¶
یک عدد صحیح شامل اندازهی بافر پیشفرضی که کلاسهای I/O بافرشدهی ماژول از آن استفاده میکنند.
open()در صورت امکان از blksize پرونده (که توسطos.stat()به دست میآید) استفاده میکند.
- io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶
این نام مستعاری برای تابع توکار
open()است.این تابع یک رویداد حسابرسی
openرا با آرگومانهای path، mode و flags پرتاب میکند. ممکن است آرگومانهای mode و flags تغییر کرده یا از فراخوانی اصلی استنتاج شده باشند.
- io.open_code(path)¶
پرونده ارائهشده را با حالت
'rb'باز میکند. این تابع باید زمانی استفاده شود که هدف، رفتار با محتویات بهعنوان کد قابل اجرا باشد.path باید از نوع
strو یک مسیر مطلق باشد.ممکن است رفتار این تابع با فراخوانی پیشین
PyFile_SetOpenCodeHook()بازنویسی شود. با این حال، با فرض اینکه path یکstrو یک مسیر مطلق باشد،open_code(path)باید همیشه مانندopen(path, 'rb')رفتار کند. بازنویسی رفتار برای اعتبارسنجی بیشتر یا پیشپردازش پرونده در نظر گرفته شده است.اضافه شده در نسخهی 3.8.
- io.text_encoding(encoding, stacklevel=2, /)¶
این یک تابع کمکی برای فراخوانیپذیرهایی است که از
open()یاTextIOWrapperاستفاده میکنند و یک پارامترencoding=Noneدارند.این تابع، encoding را در صورتی که
Noneنباشد، برمیگرداند. در غیر این صورت، بسته به حالت UTF-8،"locale"یا"utf-8"را برمیگرداند.این تابع در صورتی یک
EncodingWarningرا نشان میدهد کهsys.flags.warn_default_encodingبرابر true باشد و encoding برابرNoneباشد. stacklevel مشخص میکند که هشدار از کجا نشان داده میشود. برای مثال:def read_text(path, encoding=None): encoding = io.text_encoding(encoding) # stacklevel=2 with open(path, encoding) as f: return f.read()
در این مثال، یک
EncodingWarningبرای فراخوانندهیread_text()نشان داده میشود.برای اطلاعات بیشتر کدگذاری متن را ببینید.
اضافه شده در نسخهی 3.10.
تغییر یافته در نسخهی 3.11:
text_encoding()هنگامی که حالت UTF-8 فعال باشد و encoding برابرNoneباشد، مقدار "utf-8" را برمیگرداند.
- exception io.BlockingIOError¶
این یک نام مستعار سازگاری برای استثنای توکار
BlockingIOErrorاست.
- exception io.UnsupportedOperation¶
استثنایی که از
OSErrorوValueErrorارثبری میکند و هنگامی پرتاب میشود که عملیات پشتیبانینشدهای روی یک جریان فراخوانی شود.
همچنین ملاحظه نمائید
sysشامل جریانهای استاندارد IO است:
sys.stdin،sys.stdoutوsys.stderr.
سلسلهمراتب کلاس¶
پیادهسازی جریانهای ورودی/خروجی بهصورت سلسلهمراتبی از کلاسها سازماندهی شده است. ابتدا کلاسهای پایه انتزاعی (ABCها)، که برای تعیین دستهبندیهای مختلف جریانها استفاده میشوند، سپس کلاسهای عینی که پیادهسازیهای استاندارد جریان را ارائه میکنند.
توجه
کلاسهای پایه انتزاعی همچنین به منظور کمک به پیادهسازی کلاسهای جریان عینی، پیادهسازیهای پیشفرضی برای برخی متدها ارائه میدهند. برای مثال، BufferedIOBase پیادهسازیهای بهینهنشدهای برای readinto() و readline() ارائه میدهد.
در بالاترین سطح سلسلهمراتب I/O، کلاس پایه انتزاعی IOBase قرار دارد. این کلاس رابط پایه برای یک جریانرا تعریف میکند. با این حال توجه داشته باشید که هیچ جدایی میان خواندن و نوشتن در جریانها وجود ندارد؛ پیادهسازیها مجاز هستند اگر از یک عملیات مشخص پشتیبانی نمیکنند، UnsupportedOperation را پرتاب کنند.
کلاس پایه انتزاعی RawIOBase، IOBase را گسترش میدهد. این کلاس با خواندن و نوشتن بایتها در یک جریان سروکار دارد. FileIO زیرکلاسی از RawIOBase است تا رابطی برای پروندههای موجود در سیستم پرونده ماشین فراهم کند.
کلاس پایه انتزاعی (ABC) BufferedIOBase، IOBase را گسترش میدهد. این کلاس به بافرینگ (buffering) روی یک جریان دودویی خام (RawIOBase) میپردازد. زیرکلاسهای آن، BufferedWriter، BufferedReader و BufferedRWPair، به ترتیب جریانهای دودویی خام قابل نوشتن، قابل خواندن، و هم قابل خواندن و هم قابل نوشتن را بافر میکنند. BufferedRandom یک رابط بافرینگشده (buffered) برای جریانهای قابل مکانیابی فراهم میکند. زیرکلاس دیگری از BufferedIOBase، BytesIO، جریانی از بایتهای درون حافظه است.
ABC TextIOBase، IOBase را گسترش میدهد. این کلاس با جریانهایی سروکار دارد که بایتهای آنها متن را نشان میدهند، و کدگذاری و کدگشایی از رشتهها و به رشتهها را مدیریت میکند. TextIOWrapper، که TextIOBase را گسترش میدهد، یک رابط متنی بافرشده برای یک جریان خام بافرشده (BufferedIOBase) است. در نهایت، StringIO یک جریان درونحافظهای برای متن است.
نام آرگومانها بخشی از مشخصات نیستند و تنها آرگومانهای open() برای استفاده بهعنوان آرگومانهای کلیدواژهای در نظر گرفته شدهاند.
جدول زیر کلاسهای پایه انتزاعی (ABC) ارائهشده توسط ماژول io را خلاصه میکند:
ABC |
به ارث میبرد |
متدهای Stub |
متدها و ویژگیهای Mixin |
|---|---|---|---|
|
|
||
|
متدهای موروثی |
||
|
متدهای موروثی |
||
|
متدهای بهارثبردهشده از |
کلاسهای پایهی I/O¶
- class io.IOBase¶
کلاس پایه انتزاعی برای تمام کلاسهای 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این ویژگیهای داده و متدها را ارائه میدهد:- close()¶
این جریان را تخلیه میکند و میبندد. اگر پرونده از قبل بسته باشد، این متد هیچ اثری ندارد. پس از بسته شدن پرونده، هر عملیاتی بر روی پرونده (مانند خواندن یا نوشتن) یک
ValueErrorرا پرتاب خواهد کرد.برای سهولت، فراخوانی این متد بیش از یک بار مجاز است؛ با این حال، تنها اولین فراخوانی اثر خواهد داشت.
- closed¶
Trueاگر جریان بسته باشد.
- fileno()¶
توصیفگر پرونده (یک عدد صحیح) زیربنایی جریان را در صورت وجود برمیگرداند. اگر شیء IO از توصیفگر پرونده استفاده نکند، یک
OSErrorپرتاب میشود.
- flush()¶
در صورت امکان، بافرهای نوشتن جریان را تخلیه میکند. این کار برای جریانهای فقطخواندنی و غیرمسدودکننده هیچ کاری انجام نمیدهد.
- isatty()¶
اگر جریان تعاملی باشد (یعنی به یک پایانه/دستگاه tty متصل باشد)،
Trueرا برمیگرداند.
- readable()¶
اگر بتوان از جریان خواند،
Trueبرمیگرداند. اگرFalseباشد،read()OSErrorرا پرتاب میکند.
- readline(size=-1, /)¶
یک خط را از جریان میخواند و برمیگرداند. اگر size مشخص شده باشد، حداکثر size بایت خوانده خواهد شد.
پایاندهنده خط برای پروندههای دودویی همیشه
b'\n'است؛ برای پروندههای متنی، میتوان از آرگومان newline درopen()برای انتخاب پایاندهنده(های) خط شناساییشده استفاده کرد.
- readlines(hint=-1, /)¶
سطرها را از جریان میخواند و فهرستی از سطرها را برمیگرداند. میتوان hint را برای کنترل تعداد سطرهای خواندهشده مشخص کرد: اگر اندازهی کل تمام سطرهای تاکنون (بر حسب بایت/نویسه) از hint بیشتر شود، سطرهای بیشتری خوانده نخواهد شد.
مقادیر hint که
0یا کمتر باشند، و همچنینNone، بهعنوان بدون راهنما در نظر گرفته میشوند.توجه داشته باشید که از قبل میتوان با استفاده از
for line in file: ...روی اشیای پرونده پیمایش کرد، بدون فراخوانیfile.readlines().
- seek(offset, whence=os.SEEK_SET, /)¶
موقعیت جریان را به 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پشتیبانی کنند. مقادیر معتبر برای یک پرونده ممکن است به این بستگی داشته باشد که پرونده در حالت متنی باز شده باشد یا دودویی.
- seekable()¶
اگر جریان از دسترسی تصادفی پشتیبانی کند،
Trueبرمیگرداند. اگرFalseباشد،seek()،tell()وtruncate()استثنایOSErrorرا پرتاب خواهند کرد.
- tell()¶
موقعیت فعلی جریان را برمیگرداند.
- truncate(size=None, /)¶
جریان را به size دادهشده بر حسب بایت تغییر اندازه دهید (یا اگر size مشخص نشده باشد، به موقعیت فعلی). موقعیت فعلی جریان تغییر نمیکند. این تغییر اندازه میتواند اندازه فعلی پرونده را افزایش یا کاهش دهد. در صورت افزایش، محتوای بخش جدید پرونده به پلتفرم بستگی دارد (در بیشتر سیستمها، بایتهای اضافی با صفر پر میشوند). اندازه جدید پرونده برگردانده میشود.
تغییر یافته در نسخهی 3.5: اکنون ویندوز هنگام افزایش اندازهی پروندهها، آنها را با صفر پر میکند.
- writable()¶
اگر جریان از نوشتن پشتیبانی کند،
Trueرا برمیگرداند. اگرFalseباشد،write()وtruncate()استثنایOSErrorرا پرتاب میکنند.
- writelines(lines, /)¶
فهرستی از سطرها را در جریان بنویسید. جداکنندههای خط اضافه نمیشوند، بنابراین معمول است که هر یک از سطرهای ارائهشده، در انتهای خود یک جداکنندهی خط داشته باشد.
- class io.RawIOBase¶
کلاس پایه برای جریانهای دودویی خام. این کلاس از
IOBaseارث میبرد.جریانهای دودویی خام معمولاً دسترسی سطح پایین به یک دستگاه یا API زیربنایی سیستمعامل را فراهم میکنند و تلاش نمیکنند آن را در ساختارهای اولیه سطح بالا کپسوله کنند (این قابلیت در سطح بالاتری در جریانهای دودویی بافرشده و جریانهای متنی انجام میشود، که بعداً در همین صفحه توضیح داده شدهاند).
RawIOBaseاین متدها را علاوه بر متدهایIOBaseفراهم میکند:- read(size=-1, /)¶
حداکثر size بایت از شیء بخوانید و آنها را برگردانید. برای سهولت، اگر size مشخصنشده باشد یا -1 باشد، تمام بایتها تا EOF برگردانده میشوند.
تلاش میکند تنها یک فراخوانی سیستم انجام دهد، اما اگر قطع شود و مدیر سیگنال استثنا پرتاب نکند، دوباره تلاش میکند (برای چرایی این موضوع PEP 475 را ببینید). این بدان معناست که اگر فراخوانی سیستمعامل کمتر از size بایت برگرداند، ممکن است کمتر از size بایت برگردانده شود.
اگر ۰ بایت بازگردانده شود و size برابر ۰ نباشد، این پایان پرونده را نشان میدهد. اگر شیء در حالت غیرمسدودکننده باشد و هیچ بایتی در دسترس نباشد،
Noneبازگردانده میشود.پیادهسازی پیشفرض به
readall()وreadinto()ارجاع میدهد.
- readall()¶
تمام بایتها را از جریانتا EOF بخوانید و برگردانید، در صورت لزوم با استفاده از چندین فراخوانی جریان.
اگر
0بایت برگردانده شود، این نشاندهنده پایان پرونده است. اگر شیء در حالت غیرمسدودکننده (non-blocking) باشد وread()زیربناییNoneرا برگرداند که نشان میدهد هیچ بایتی در دسترس نیست،Noneبرگردانده میشود.
- readinto(b, /)¶
بایتها را در یک bytes-like object از پیش تخصیصیافته و قابلنوشتن b میخواند و تعداد بایتهای خواندهشده را برمیگرداند. برای مثال، b ممکن است یک
bytearrayباشد.اگر
0بازگردانده شود وlen(b)برابر0نباشد، این نشاندهنده پایان پرونده است. اگر شیء در حالت غیرمسدودکننده باشد و هیچ بایتی در دسترس نباشد،Noneبازگردانده میشود.
- write(b, /)¶
bytes-like object دادهشده، b، را در جریان خام زیرین مینویسد و تعداد بایتهای نوشتهشده را برمیگرداند. این مقدار، بسته به جزئیات جریان خام زیرین و بهویژه اگر در حالت غیرمسدودکننده باشد، میتواند کمتر از طول b بر حسب بایت باشد. اگر جریان خام بهگونهای تنظیم شده باشد که مسدود نکند و هیچ بایتی بهراحتی قابل نوشتن در آن نباشد،
Noneبرگردانده میشود. فراخواننده ممکن است پس از بازگشت این متد، b را آزاد کند یا تغییر دهد، بنابراین پیادهسازی باید تنها در حین فراخوانی متد به b دسترسی داشته باشد.هشدار
این تابع تضمین نمیکند که همهی بایتها نوشته شوند یا استثنایی پرتاب شود. فراخوانندگان میتوانند آن رفتار را با بررسی مقدار بازگشتی پیادهسازی کنند و اگر این مقدار کمتر از طول b باشد، با حلقهای از فراخوانیهای write بیشتر، همهی بایتهای نوشتهنشده را بنویسند. اشیای سطح بالای I/O مانند ورودی/خروجی دودویی و ورودی/خروجی متنی رفتار تلاش مجدد را پیادهسازی میکنند.
- class io.BufferedIOBase¶
کلاس پایه برای جریانهای دودویی که از نوعی بافرینگ (buffering) پشتیبانی میکنند. این کلاس از
IOBaseارث میبرد.تفاوت اصلی با
RawIOBaseاین است که متدهایread()،readinto()وwrite()تلاش خواهند کرد (بهترتیب) تا ورودی را به اندازهی درخواستشده بخوانند یا تمام دادههای ارائهشده را خارج کنند.علاوه بر این، اگر جریان خام زیربنایی در حالت غیرمسدودکننده باشد، هرگاه سیستم وضعیت would block را برگرداند،
write()استثناBlockingIOErrorرا باBlockingIOError.characters_writtenپرتاب میکند وread()دادههای خواندهشده تاکنون را برمیگرداند، یا اگر دادهای در دسترس نباشدNoneبرمیگرداند.علاوه بر این، متد
read()پیادهسازی پیشفرضی که بهreadinto()ارجاع دهد، ندارد.یک پیادهسازی معمول
BufferedIOBaseنباید از یک پیادهسازیRawIOBaseارث ببرد، بلکه باید آن را بپوشاند، همانطور کهBufferedWriterوBufferedReaderاین کار را انجام میدهند.BufferedIOBaseاین ویژگیهای داده و متدها را علاوه بر موارد موجود درIOBase، ارائه میکند یا بازنویسی میکند:- raw¶
جریان خام زیربنایی (یک نمونه از
RawIOBase) کهBufferedIOBaseبا آن سروکار دارد. این بخشی از APIBufferedIOBaseنیست و ممکن است در برخی پیادهسازیها وجود نداشته باشد.
- detach()¶
جریان خام زیربنایی را از بافر جدا میکند و آن را برمیگرداند.
پس از جدا شدن جریان خام، بافر در وضعیت غیرقابلاستفاده است.
برخی بافرها، مانند
BytesIO، مفهوم یک جریان خام واحد برای بازگرداندن از این متد را ندارند. آنهاUnsupportedOperationرا پرتاب میکنند.اضافه شده در نسخهی 3.1.
- read(size=-1, /)¶
حداکثر size بایت را میخواند و برمیگرداند. اگر آرگومان حذفشده باشد،
Noneباشد یا منفی باشد، تا حد ممکن میخواند.ممکن است بایتهای کمتری نسبت به تعداد درخواستشده بازگردانده شود. اگر جریان از قبل در EOF باشد، یک شیء
bytesخالی بازگردانده میشود. ممکن است بیش از یک خواندن انجام شود و در صورت مواجهه با خطاهای خاص، فراخوانیها بازآزمایی شوند؛ برای جزئیات بیشترos.read()و PEP 475 را ببینید. بازگردانده شدن کمتر از size بایت، به این معنا نیست که EOF قریبالوقوع است.هنگام خواندن تا حد امکان، پیادهسازی پیشفرض در صورت در دسترس بودن از
raw.readallاستفاده میکند (که بایدRawIOBase.readall()را پیادهسازی کند)، در غیر این صورت در یک حلقه میخواند تا زمانی که readNone، یکbytesخالی، یا یک خطای غیرقابلتلاش مجدد را برگرداند. برای بیشتر جریانها، این فرآیند تا EOF ادامه دارد، اما برای جریانهای غیرمسدودکننده ممکن است دادههای بیشتری در دسترس قرار بگیرند.توجه
هنگامی که جریان خام زیربنایی غیرمسدودکننده باشد، پیادهسازیها ممکن است در صورت در دسترس نبودن داده،
BlockingIOErrorرا پرتاب کنند یاNoneرا برگردانند. پیادهسازیهایioمقدارNoneرا برمیگردانند.
- read1(size=-1, /)¶
حداکثر تا size بایت را با فراخوانی
readinto()میخواند و برمیگرداند؛ این متد ممکن است در صورت مواجهه باEINTRمطابق PEP 475 دوباره تلاش کند. اگر size برابر-1باشد یا ارائه نشده باشد، پیادهسازی مقدار دلخواهی برای size انتخاب خواهد کرد.توجه
هنگامی که جریان خام زیربنایی غیرمسدودکننده باشد، پیادهسازیها ممکن است در صورت در دسترس نبودن داده،
BlockingIOErrorرا پرتاب کنند یاNoneرا برگردانند. پیادهسازیهایioمقدارNoneرا برمیگردانند.
- readinto(b, /)¶
بایتها را در یک شیء شبهبایت (bytes-like object) از پیش تخصیصدادهشده و قابلنوشتن b میخواند و تعداد بایتهای خواندهشده را برمیگرداند. برای مثال، b ممکن است یک
bytearrayباشد.مانند
read()، ممکن است چندین عملیات خواندن به جریان خام زیرین صادر شود، مگر اینکه این جریان تعاملی باشد.اگر جریان خام زیربنایی در حالت غیرمسدودکننده باشد و در حال حاضر دادهای در دسترس نداشته باشد، یک
BlockingIOErrorپرتاب میشود.
- readinto1(b, /)¶
بایتها را با استفاده از حداکثر یک فراخوانی متد
read()(یاreadinto()) جریان خام زیربنایی، در یک شیء شبهبایت b از پیش تخصیصیافته و قابل نوشتن بخوانید. تعداد بایتهای خواندهشده را برگردانید.اگر جریان خام زیربنایی در حالت غیرمسدودکننده باشد و در حال حاضر دادهای در دسترس نداشته باشد، یک
BlockingIOErrorپرتاب میشود.اضافه شده در نسخهی 3.5.
- write(b, /)¶
bytes-like object دادهشده، b، را مینویسد و تعداد بایتهای نوشتهشده را برمیگرداند (همیشه برابر با طول b بر حسب بایت است، زیرا اگر نوشتن ناموفق باشد، یک
OSErrorپرتاب میشود). بسته به پیادهسازی واقعی، این بایتها ممکن است بهراحتی در جریان زیرین نوشته شوند، یا به دلایل کارایی و تأخیر در یک بافر نگهداری شوند.در حالت غیرمسدودکننده، اگر دادهای نیاز باشد در جریان خام نوشته شود اما جریان خام نتواند همهی دادهها را بدون مسدودسازی بپذیرد، استثنای
BlockingIOErrorپرتاب میشود.فراخواننده ممکن است b را پس از بازگشت این متد آزاد کند یا تغییر دهد، بنابراین پیادهسازی باید فقط در حین فراخوانی متد به b دسترسی داشته باشد.
ورودی/خروجی خام پرونده¶
- class io.FileIO(name, mode='r', closefd=True, opener=None)¶
یک جریان دودویی خام که نشاندهندهی پروندهای در سطح سیستمعامل حاوی دادههای بایتی است. این جریان از
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ارائه میدهد:- mode¶
حالت، همانطور که در سازنده داده شده است.
- name¶
نام پرونده. هنگامی که در سازنده نامی داده نشده باشد، این مقدار توصیفگر پرونده است.
جریانهای بافرشده¶
جریانهای ورودی/خروجی بافرشده، نسبت به ورودی/خروجی خام، رابط سطح بالاتری را برای یک دستگاه ورودی/خروجی فراهم میکنند.
- class io.BytesIO(initial_bytes=b'')¶
یک جریان دودویی که از یک بافر بایت در حافظه استفاده میکند. این کلاس از
BufferedIOBaseارث میبرد. هنگامی که متدclose()فراخوانی شود، بافر دور انداخته میشود.آرگومان اختیاری initial_bytes یک bytes-like object است که حاوی دادههای اولیه است.
BytesIOاین متدها را علاوه بر متدهایBufferedIOBaseوIOBaseارائه میدهد یا بازنویسی میکند:- getbuffer()¶
یک نمای قابلخواندن و قابلنوشتن بر روی محتوای بافربرمیگرداند، بدون آنکه محتوا را کپی کند. همچنین، تغییر نما بهصورت شفاف محتوای بافر را بهروزرسانی میکند:
>>> b = io.BytesIO(b"abcdef") >>> view = b.getbuffer() >>> view[2:4] = b"56" >>> b.getvalue() b'ab56ef'
توجه
تا زمانی که نما وجود دارد، نمیتوان اندازهی شیء
BytesIOرا تغییر داد یا آن را بست.اضافه شده در نسخهی 3.2.
- read1(size=-1, /)¶
در
BytesIO، این همانread()است.تغییر یافته در نسخهی 3.7: آرگومان size اکنون اختیاری است.
- readinto1(b, /)¶
در
BytesIO، این همانreadinto()است.اضافه شده در نسخهی 3.5.
- class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
یک جریان دودویی بافرشده که دسترسی سطح بالاتری به یک جریان دودویی خام
RawIOBaseخواندنی و غیرقابل مکانیابی فراهم میکند. این جریان ازBufferedIOBaseارث میبرد.هنگام خواندن داده از این شیء، ممکن است مقدار بیشتری داده از جریان خام زیربنایی درخواست شود و در یک بافر داخلی نگهداری شود. سپس دادههای بافریشده میتوانند مستقیماً در خواندنهای بعدی برگردانده شوند.
سازنده، یک
BufferedReaderرا برای جریان raw قابلخواندن و buffer_size دادهشده ایجاد میکند. اگر buffer_size ذکر نشود، ازDEFAULT_BUFFER_SIZEاستفاده میشود.BufferedReaderعلاوه بر متدهایBufferedIOBaseوIOBase، این متدها را فراهم میکند یا بازنویسی مینماید:- peek(size=0, /)¶
بایتهایی از جریان را بدون پیش بردن موقعیت برمیگرداند. تعداد بایتهای برگرداندهشده ممکن است کمتر یا بیشتر از تعداد درخواستشده باشد. اگر جریان خام زیربنایی غیرمسدودکننده باشد و عملیات منجر به انسداد شود، بایتهای خالی برمیگرداند.
- read(size=-1, /)¶
در
BufferedReader، این همانio.BufferedIOBase.read()است
- read1(size=-1, /)¶
در
BufferedReader، این همانio.BufferedIOBase.read1()استتغییر یافته در نسخهی 3.7: آرگومان size اکنون اختیاری است.
- class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
یک جریان دودویی بافردار که دسترسی سطح بالاتری را به یک جریان دودویی خام قابل نوشتن و غیرقابل جستجو از نوع
RawIOBaseفراهم میکند. این کلاس ازBufferedIOBaseارثبری میکند.هنگام نوشتن در این شیء، دادهها معمولاً در یک بافر داخلی قرار میگیرند. این بافر در شرایط مختلف به شیء
RawIOBaseزیرین نوشته میشود، از جمله:هنگامی که بافر برای همهی دادههای در انتظار بیش از حد کوچک شود؛
هنگامی که
flush()فراخوانی میشود؛هنگامی که یک
seek()درخواست شود (برای اشیایBufferedRandom);هنگامی که شیء
BufferedWriterبسته یا نابود میشود.
سازنده یک
BufferedWriterبرای جریان raw قابلنوشتن دادهشده ایجاد میکند. اگر buffer_size داده نشود، مقدار پیشفرض آنDEFAULT_BUFFER_SIZEخواهد بود.BufferedWriterاین متدها را علاوه بر متدهایBufferedIOBaseوIOBaseفراهم میکند یا بازنویسی میکند:- flush()¶
بایتهای نگهداشتهشده در بافر را به جریان خام وارد کنید. اگر جریان خام مسدود شود، باید یک
BlockingIOErrorپرتاب شود.
- write(b, /)¶
شیء شبهبایت، b را مینویسد و تعداد بایتهای نوشتهشده را برمیگرداند. در حالت غیرمسدودکننده، اگر نیاز باشد بافر نوشته شود اما جریان خام مسدود شود، استثنای
BlockingIOErrorکهBlockingIOError.characters_writtenآن تنظیم شده است، پرتاب میشود.
- class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
یک جریان دودویی بافرشده که رابطهای
BufferedIOBaseرا پیادهسازی میکند و دسترسی سطح بالاتر به یک جریان دودویی خام قابل مکانیابیRawIOBaseفراهم میکند.سازنده یک خواننده و نویسنده برای جریان خام قابل مکانیابی دادهشده در اولین آرگومان ایجاد میکند. اگر buffer_size حذف شود، بهطور پیشفرض برابر با
DEFAULT_BUFFER_SIZEخواهد بود.BufferedRandomقادر است هر کاری را کهBufferedReaderیاBufferedWriterمیتوانند انجام دهند، انجام دهد. علاوه بر این، پیادهسازیseek()وtell()تضمین شده است.
- class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /)¶
یک جریان دودویی بافرشده که دسترسی سطح بالاتری به دو جریان دودویی خام غیرقابل جستجو (non-seekable) از
RawIOBaseفراهم میکند — یکی قابل خواندن و دیگری قابل نوشتن. این کلاس ازBufferedIOBaseارث میبرد.reader و writer اشیاء
RawIOBaseهستند که بهترتیب قابل خواندن و قابل نوشتن میباشند. اگر buffer_size ذکر نشود، مقدار پیشفرض آنDEFAULT_BUFFER_SIZEخواهد بود.BufferedRWPairهمه متدهایBufferedIOBaseرا پیادهسازی میکند، بهجزdetach()کهUnsupportedOperationرا پرتاب میکند.هشدار
BufferedRWPairتلاش نمیکند دسترسیها به جریانهای خام زیربنایی خود را همگامسازی کند. نباید یک شیء یکسان را بهعنوان خواننده و نویسنده به آن بدهید؛ در عوض ازBufferedRandomاستفاده کنید.
ورودی/خروجی متنی¶
- class io.TextIOBase¶
کلاس پایه برای جریانهای متنی. این کلاس یک رابط مبتنی بر نویسه و خط برای ورودی/خروجی جریان فراهم میکند. این کلاس از
IOBaseارث میبرد.TextIOBaseاین ویژگیهای داده و متدها را علاوه بر موارد موجود درIOBaseارائه میدهد یا بازنویسی میکند:- encoding¶
نام کدگذاریای که برای کدگشایی بایتهای جریان به رشتهها و کدگذاری رشتهها به بایتها استفاده میشود.
- errors¶
تنظیم خطای کدگشا یا کدگذار.
- newlines¶
یک رشته، یک تاپل از رشتهها، یا
None، که نشاندهندهی سطرهای جدیدی است که تاکنون ترجمه شدهاند. بسته به پیادهسازی و پرچمهای اولیهی سازنده، ممکن است این در دسترس نباشد.
- buffer¶
بافر دودویی زیربنایی (یک نمونه از
BufferedIOBaseیاRawIOBase) کهTextIOBaseبا آن سروکار دارد. این بخشی از APITextIOBaseنیست و ممکن است در برخی پیادهسازیها وجود نداشته باشد.
- detach()¶
بافر دودویی زیربنایی را از
TextIOBaseجدا میکند و آن را برمیگرداند.پس از جدا شدن بافر زیرین،
TextIOBaseدر وضعیت غیرقابلاستفاده قرار میگیرد.برخی از پیادهسازیهای
TextIOBase، مانندStringIO، ممکن است مفهوم یک بافرزیرین را نداشته باشند و فراخوانی این متد موجب پرتابUnsupportedOperationمیشود.اضافه شده در نسخهی 3.1.
- read(size=-1, /)¶
حداکثر size نویسه را از جریان بهصورت یک
strواحد میخواند و برمیگرداند. اگر size منفی یاNoneباشد، تا EOF میخواند.
- readline(size=-1, /)¶
تا خط جدید یا EOF میخواند و یک
strواحد برمیگرداند. اگر جریان از قبل در EOF باشد، یک رشته خالی برگردانده میشود.اگر size تعیین شده باشد، حداکثر size نویسه خوانده خواهد شد.
- seek(offset, whence=SEEK_SET, /)¶
موقعیت جریان را به offset دادهشده تغییر میدهد. رفتار به پارامتر whence بستگی دارد. مقدار پیشفرض برای whence،
SEEK_SETاست.SEEK_SETیا0: جابهجایی از ابتدای جریان (پیشفرض)؛ offset باید یا عددی باشد که توسطTextIOBase.tell()برگردانده شده است، یا صفر. هر مقدار دیگری برای offset رفتار تعریفنشدهای ایجاد میکند.SEEK_CURیا1: «جستجو» (seek) به موقعیت جاری؛ offset باید صفر باشد، که یک عملیات بدون اثر است (تمام مقادیر دیگر پشتیبانی نمیشوند).SEEK_ENDیا2: به انتهای جریان بروید؛ offset باید صفر باشد (تمام مقادیر دیگر پشتیبانی نمیشوند).
موقعیت مطلق جدید را بهعنوان یک عدد غیرشفاف برمیگرداند.
اضافه شده در نسخهی 3.1: ثابتهای
SEEK_*.
- tell()¶
موقعیت جاری جریان را بهعنوان یک عدد غیرشفاف برمیگرداند. این عدد معمولاً نشاندهندهی تعدادی بایت در فضای ذخیرهسازی دودویی زیرین نیست.
- write(s, /)¶
رشتهی s را در جریان مینویسد و تعداد نویسههای نوشتهشده را برمیگرداند.
- class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)¶
یک جریان متنی بافرشده که دسترسی سطح بالاتری به یک جریان دودویی بافرشده از
BufferedIOBaseفراهم میکند. این جریان ازTextIOBaseارثبری میکند.encoding نام کدگذاریای را مشخص میکند که جریان با آن کدگشایی یا کدگذاری میشود. در حالت UTF-8، این مقدار بهطور پیشفرض UTF-8 است. در غیر این صورت، مقدار پیشفرض آن
locale.getencoding()است. میتوان ازencoding="locale"برای مشخص کردن صریح کدگذاری 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¶
اینکه بافرینگ سطری (line buffering) فعال است یا خیر.
- write_through¶
اینکه آیا نوشتارها بلافاصله به بافر دودویی زیرین ارسال میشوند.
اضافه شده در نسخهی 3.7.
- reconfigure(*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None)¶
این جریان متنی را با استفاده از تنظیمات جدید برای encoding، errors، newline، line_buffering و write_through بازپیکربندی کنید.
پارامترهای مشخصنشده، تنظیمات فعلی را حفظ میکنند، بهجز وقتی که encoding مشخص شده باشد اما errors مشخص نشده باشد؛ در این صورت از
errors='strict'استفاده میشود.اگر پیشتر مقداری داده از جریان خوانده شده باشد، تغییر کدگذاری یا خط جدید ممکن نیست. از سوی دیگر، تغییر کدگذاری پس از نوشتن ممکن است.
این متد پیش از تنظیم پارامترهای جدید، جریان را بهصورت ضمنی تخلیه میکند.
اضافه شده در نسخهی 3.7.
تغییر یافته در نسخهی 3.11: این متد از گزینهی
encoding="locale"پشتیبانی میکند.
- seek(cookie, whence=os.SEEK_SET, /)¶
موقعیت جریان را تنظیم میکند. موقعیت جدید جریان را بهعنوان یک
intبرمیگرداند.چهار عملیات پشتیبانی میشود که با ترکیبهای آرگومان زیر مشخص میشوند:
seek(0, SEEK_SET): به ابتدای جریان بازمیگردد.seek(cookie, SEEK_SET): بازگرداندن موقعیت قبلی؛ cookie باید عددی باشد کهtell()آن را برمیگرداند.seek(0, SEEK_END): پرش سریع به انتهای جریان.seek(0, SEEK_CUR): موقعیت فعلی جریان را بدون تغییر باقی میگذارد.
هر ترکیب دیگری از آرگومانها نامعتبر است و ممکن است استثناهایی را پرتاب کند.
همچنین ملاحظه نمائید
- class io.StringIO(initial_value='', newline='\n')¶
جریان متنی که از یک بافر متنی در حافظه استفاده میکند. این جریان از
TextIOBaseارث میبرد.بافر متنی هنگام فراخوانی متد
close()دور ریخته میشود.مقدار اولیهی بافر را میتوان با ارائهی initial_value تنظیم کرد. اگر ترجمهی خط جدید فعال باشد، نویسههای خط جدید طوری کدگذاری میشوند که گویی توسط
write()کدگذاری شدهاند. جریان در ابتدای بافر قرار میگیرد؛ این حالت، باز کردن یک پرونده موجود در حالتw+را شبیهسازی میکند و جریان را برای نوشتن فوری از ابتدا یا برای نوشتنی که مقدار اولیه را بازنویسی میکند، آماده میسازد. برای شبیهسازی باز کردن یک پرونده در حالتa+که برای افزودن آماده است، ازf.seek(0, io.SEEK_END)برای تغییر موقعیت جریان به انتهای بافر استفاده کنید.آرگومان newline مانند آرگومان newline در
TextIOWrapperعمل میکند، با این تفاوت که هنگام نوشتن خروجی در جریان، اگر newline برابرNoneباشد، سطرهای جدید بهصورت\nدر همهی سکوها نوشته میشوند.StringIOاین متد را علاوه بر متدهایTextIOBaseوIOBaseارائه میدهد:- getvalue()¶
یک
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()
- class io.IncrementalNewlineDecoder¶
یک کدک کمکی که سطرهای جدید را برای حالت سطرهای جدید جهانشمول (universal newlines) کدگشایی میکند. این کدک از
codecs.IncrementalDecoderارث میبرد.
نوعدهی ایستا¶
پروتکلهای زیر میتوانند برای حاشیهنویسی آرگومانهای تابع و متد در عملیات سادهی خواندن یا نوشتن جریان استفاده شوند. این پروتکلها با @typing.runtime_checkable آراسته شدهاند.
- class io.Reader[T]¶
پروتکل عام برای خواندن از یک پرونده یا جریان ورودی دیگر.
Tمعمولاًstrیاbytesخواهد بود، اما میتواند هر نوعی باشد که از جریان خوانده میشود.اضافه شده در نسخهی 3.14.
- read()¶
- read(size, /)
داده را از جریان ورودی میخواند و آن را برمیگرداند. اگر size مشخص شده باشد، باید عدد صحیح باشد و حداکثر size آیتم (بایت/نویسه) خوانده میشود.
برای مثال:
def read_it(reader: Reader[str]): data = reader.read(11) assert isinstance(data, str)
- class io.Writer[T]¶
پروتکل عام برای نوشتن در یک پرونده یا جریان خروجی دیگر.
Tمعمولاًstrیاbytesخواهد بود، اما میتواند هر نوعی باشد که بتوان آن را در جریان نوشت.اضافه شده در نسخهی 3.14.
- write(data, /)¶
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 نخایمن نیستند.
بازورودپذیری (Reentrancy)¶
اشیای بافرشدهی دودویی (نمونههایی از BufferedReader، BufferedWriter، BufferedRandom و BufferedRWPair) بازورودپذیر نیستند. اگرچه فراخوانیهای بازورودپذیر در شرایط عادی رخ نمیدهند، اما ممکن است در اثر انجام I/O در یک هندلر سیگنال از signal پیش بیایند. اگر یک نخ تلاش کند به یک شیء بافرشده که هماکنون در حال دسترسی به آن است دوباره وارد شود، یک RuntimeError پرتاب میشود. توجه داشته باشید که این موضوع یک نخ دیگر را از ورود به شیء بافرشده باز نمیدارد.
مورد بالا بهطور ضمنی به پروندههای متنی نیز تعمیم مییابد، زیرا تابع open() یک شیء بافرشده را درون یک TextIOWrapper قرار میدهد. این موضوع شامل جریانهای استاندارد نیز میشود و بنابراین تابع توکار print() را نیز تحت تأثیر قرار میدهد.