open() یک شیء فایل برمیگرداند، و معمولاً با دو آرگومان موقعیتی و یک آرگومان کلیدی استفاده میشود:
open(filename, mode, encoding=None)
>>> f = open('workfile', 'w', encoding="utf-8")
آرگومان اول رشتهای حاوی نام فایل است. آرگومان دوم رشتهای دیگر است که شامل چند کاراکتر توصیف نحوه استفاده از فایل است. mode میتواند 'r' باشد وقتی فایل فقط خوانده میشود، 'w' برای فقط نوشتن (فایل موجود با همان نام پاک میشود)، و 'a' فایل را برای الحاق باز میکند؛ هر دادهای که به فایل نوشته شود به انتهای فایل اضافه میشود. 'r+' فایل را برای هم خواندن و هم نوشتن باز میکند. آرگومان mode اختیاری است؛ 'r' فرض خواهد شد اگر حذف شود.
معمولاً، فایلها در حالت متن باز میشوند، یعنی شما رشتهها را از و به فایل میخوانید و مینویسید که در یک رمزگذاری خاص رمزگذاری شدهاند. اگر encoding مشخص نشده باشد، پیشفرض وابسته به پلتفرم است. از آنجا که UTF-8 استاندارد مبتنی بر事实上 현대 استاندارد است، encoding="utf-8" توصیه میشود مگر اینکه بدانید نیاز به رمزگذاری متفاوتی دارید. افزودن 'b' به mode فایل را در حالت باینری باز میکند. دادههای حالت باینری به عنوان اشیاء bytes خوانده و نوشته میشوند. نمیتوانید encoding را هنگام باز کردن فایل در حالت باینری مشخص کنید.
در حالت متن، پیشفرض هنگام خواندن تبدیل پایان خطهای مخصوص پلتفرم (\n در Unix، \r\n در Windows) به فقط \n است. هنگام نوشتن در حالت متن، پیشفرض تبدیل وقوع \n обратно به پایان خطهای مخصوص پلتفرم است. این تغییر پشت صحنه برای فایلهای متن خوب است، اما دادههای باینری مانند در فایلهای JPEG یا EXE را خراب میکند. بسیار مراقب باشید هنگام خواندن و نوشتن چنین فایلها از حالت باینری استفاده کنید.
استفاده از کلمه کلیدی with هنگام کار با اشیاء فایل تمرین خوبی است. مزیت این است که فایل به طور مناسب پس از اتمام بلوک بسته میشود، حتی اگر یک استثنا در برخی نقطهها ایجاد شود. استفاده از with همچنین بسیار کوتاهتر از نوشتن بلوکهای معادل try-finally است:
>>> with open('workfile', encoding="utf-8") as f:
... read_data = f.read()
...
>>> # میتوانیم بررسی کنیم که فایل به طور خودکار بسته شده است.
>>> f.closed
True
اگر از کلمه کلیدی with استفاده نمیکنید، باید f.close() را برای بستن فایل و آزادسازی فوری منابع سیستمی استفاده شده فراخوانی کنید.
هشدار: فراخوانی f.write() بدون استفاده از کلمه کلیدی with یا فراخوانی f.close() ممکن است منجر به این شود که آرگومانهای f.write() به طور کامل روی دیسک نوشته نشوند، حتی اگر برنامه با موفقیت خاتمه یابد.
پس از اینکه یک شیء فایل بسته شود، یا توسط عبارت with یا فراخوانی f.close()، تلاش برای استفاده از شیء فایل به طور خودکار شکست میخورد:
>>> f.close() >>> f.read() Traceback (most recent call last): File "", line 1, in ValueError: I/O operation on closed file.
بقیه مثالها در این بخش فرض میکنند که یک شیء فایل به نام f قبلاً ایجاد شده است.
برای خواندن محتوای فایل، f.read(size) را فراخوانی کنید، که مقداری داده را میخواند و به عنوان رشته (در حالت متن) یا شیء بایت (در حالت باینری) برمیگرداند. size یک آرگومان عددی اختیاری است. وقتی size حذف یا منفی باشد، کل محتوای فایل خوانده و برگردانده میشود؛ اگر فایل دو برابر حافظه ماشین شما باشد проблема شما است. در غیر این صورت، حداکثر size کاراکتر (در حالت متن) یا size بایت (در حالت باینری) خوانده و برگردانده میشود. اگر انتهای فایل رسیده شده باشد، f.read() یک رشته خالی برمیگرداند.
>>> f.read() 'This is the entire file.\n' >>> f.read() ''
f.readline() یک خط تکی از فایل میخواند؛ کاراکتر خط جدید (\n) در انتهای رشته باقی میماند، و فقط در آخرین خط فایل اگر فایل به خط جدید ختم نشود حذف میشود. این باعث میشود مقدار بازگشتی غیر مبهم باشد؛ اگر f.readline() رشته خالی برگرداند، انتهای فایل رسیده شده است، در حالی که یک خط خالی با '\n' نمایش داده میشود.
>>> f.readline() 'This is the first line of the file.\n' >>> f.readline() 'Second line of the file\n' >>> f.readline() ''
برای خواندن خطوط از یک فایل، میتوانید روی شیء فایل حلقه بزنید. این کار کارآمد از نظر حافظه، سریع است و کد ساده مینویسید:
>>> for line in f: ... print(line, end='') ... This is the first line of the file. Second line of the file
اگر میخواهید تمام خطوط یک فایل را در یک لیست بخوانید میتوانید از list(f) یا f.readlines() استفاده کنید.
f.write(string) محتوای string را به فایل مینویسد، تعداد کاراکترهای نوشته شده را برمیگرداند.
>>> f.write('This is a test\n')
15
سایر انواع اشیاء باید تبدیل شوند - یا به رشته (در حالت متن) یا شیء بایت (در حالت باینری) - قبل از نوشتن:
>>> value = ('the answer', 42)
>>> s = str(value) # تبدیل تاپل به رشته
>>> f.write(s)
18
f.tell() یک عدد صحیح برمیگرداند که موقعیت جاری شیء فایل در فایل را به عنوان تعداد بایت از ابتدای فایل در حالت باینری و یک عدد مبهم در حالت متن نشان میدهد.
برای تغییر موقعیت شیء فایل، از f.seek(offset, whence) استفاده کنید. موقعیت از اضافه کردن offset به یک نقطه مرجع محاسبه میشود؛ نقطه مرجع توسط آرگومان whence انتخاب میشود. مقدار whence برابر ۰ از ابتدای فایل، ۱ از موقعیت جاری فایل، و ۲ از انتهای فایل به عنوان نقطه مرجع استفاده میکند. whence میتواند حذف شود و به ۰ پیشفرض میشود، یعنی از ابتدای فایل به عنوان نقطه مرجع استفاده میکند.
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # برو به بایت ششم در فایل
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # برو به بایت سوم قبل از پایان
13
>>> f.read(1)
b'd'
در فایلهای متن (آنها که بدون b در رشته mode باز شدهاند)، فقط جستجوهای نسبی به ابتدای فایل مجاز هستند (استثنا جستجو به انتهای فایل با seek(0, 2)) و مقادیر offset معتبر فقط آنهایی هستند که از f.tell() برگردانده شدهاند، یا صفر. هر مقدار offset دیگر رفتار نامشخصی تولید میکند.
اشیاء فایل برخی متدهای اضافه هم دارند، مانند isatty() و truncate() که کمتر استفاده میشوند؛ برای راهنمای کامل به Library Reference مراجعه کنید.
رشتهها به راحتی میتوان در فایل نوشته و خوانده شوند. اعداد کمی تلاش بیشتری میخواهند، چون متد read() فقط رشته برمیگرداند که باید به توابعی مانند int() پاس داده شوند. وقتی میخواهید انواع داده پیچیدهتر مانند لیستهای تودرتو و دیکشنریها را ذخیره کنید، تجزیه و سریالیسازی دستی پیچیده میشود.
به جای اینکه کاربران مدام کد بنویسند و اشکالزدایی کنند تا انواع داده پیچیده را در فایل ذخیره کنند، پایتون اجازه میدهد از فرمت محبوب تبادل داده به نام JSON (JavaScript Object Notation) استفاده کنید. ماژول استاندارد json میتواند سلسله مراتب داده پایتون را بگیرد و به نمایش رشتهای تبدیل کند؛ این فرآیند سریالیسازی نامیده میشود. بازسازی داده از نمایش رشتهای دسیریالیسازی نامیده میشود. بین سریالیسازی و دسیریالیسازی، رشته نمایشدهنده شیء ممکن است در یک فایل یا داده ذخیره شده باشد، یا از طریق اتصال شبکه به ماشین دور ارسال شده باشد.
نکته: فرمت JSON به طور رایج توسط برنامههای مدرن برای اجازه دادن به تبادل داده استفاده میشود. بسیاری از برنامهنویسان از قبل با آن آشنا هستند، که آن را انتخاب خوبی برای کارهمیسازی میکند.
اگر شیءای x داشته باشید، میتوانید نمایش رشته JSON آن را با یک خط ساده کد ببینید:
>>> import json >>> x = [1, 'simple', 'list'] >>> json.dumps(x) '[1, "simple", "list"]'
گونهای دیگر از تابع json.dumps() به نام json.dump() وجود دارد که مستقیماً شیء را به یک فایل متن سریالیسازی میکند. پس اگر f یک شیء فایل متن برای نوشتن باز شده باشد، میتوانیم این کار را انجام دهیم:
json.dump(x, f)
برای رمزگشایی دوباره شیء، اگر f یک شیء فایل باینری یا فایل متن باشد که برای خواندن باز شده است:
x = json.load(f)
نکته: فایلهای JSON باید در UTF-8 رمزگذاری شده باشند. از encoding="utf-8" هنگام باز کردن فایل JSON به عنوان فایل متن برای هم خواندن و هم نوشتن استفاده کنید.
این تکنیک ساده سریالیسازی میتواند لیستها و دیکشنریها را مدیریت کند، اما سریالیسازی نمونههای دلخواه کلاس در JSON کمی تلاش اضافی میخواهد. مرجع ماژول json توضیح این موضوع را دارد.
همچنین ببینید:
pickle - ماژول pickle
برخلاف JSON، pickle پروتکلی است که اجازه سریالیسازی اشیاء دلخواه پیچیده پایتون را میدهد. به همین دلیل، مخصوص پایتون است و نمیتواند برای ارتباط با برنامههای نوشته شده در زبانهای دیگر استفاده شود. همچنین به طور پیشفرض ناامن است: دسیریالیسازی دادههای pickle از منبع قابل اعتماد نباید میتواند کد دلخواه اجرا کند، اگر دادهها توسط مهاجم ماهر طراحی شده باشند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial