Введення і виведення
Ознайомити користувача з висновком програми можна різними способами - дані можуть бути виведені в читабельному вигляді або записані в файл для подальшого використання. Частина можливостей буде обговорена в цьому розділі.
Зручне форматування виводу
На даний момент ми з'ясували два способи виведення значень: операторні вирази (expression statements) і функція print (). (Третій спосіб - використання методу write () об'єктів файлів; на файл стандартного виводу можна послатися як на sys.stdout. Більш детальну інформацію з цього пункту дивіться в Довіднику по бібліотеці.)
Часто виникає бажання мати більший контроль над форматуванням виведення, ніж звичайна друк значень розділених пробілами. Є два способи форматування вашого виведення. Перший спосіб - виконувати самостійно всю роботу над рядками: використовуючи зрізи рядків і конкатенацію ви можете створити будь-який шаблон, який забажаєте. Стандартний модуль string містить багато корисних операцій для вирівнювання рядків по певній ширині колонки (скоро ми їх коротко розглянемо). Другий спосіб - використання методу str.format ().
Модуль string містить клас Template. який надає ще один спосіб підстановки значень в рядки.
Залишається, звичайно, одне питання: яким чином конвертувати значення в рядки? На щастя, в Python є два способи для перетворення будь-якого значення в рядок - це функції repr () і str ().
Ось два способи вивести таблицю квадратів і кубів:
(Зверніть увагу, що в першому прикладі поодинокі прогалини між колонками додані функцією print (). Вона завжди вставляє прогалини між своїми параметрами)
Цей приклад демонструє роботу методу строкових об'єктів rjust (). вирівнюючого рядок по правому краю в поле переданої ширини, відступаючи пробілами зліва. Є також схожі методи ljust () і center (). Ці методи не виводять нічого, вони лише повертають новий рядок. Якщо рядок на вході надто довга, то вони не скорочуються її, що зазвичай є найменшим злом. (Для усічення можна додати операцію зрізу, наприклад: x.ljust (n) [: n].)
Є інший метод - zfill (). який заповнює нулями простір зліва від числової рядки. Він розпізнає знаки плюс і мінус:
Основний спосіб застосування методу str.format () виглядає так:
Дужки з символами всередині (їх називають полями форматування (format fields)) замінюються на об'єкти, передані методу format. Номер в дужках позначає позицію об'єкта в списку параметрів, переданих методу format.
Якщо в методі format використовуються іменовані параметри, можна посилатися на їх значення, використовуючи ім'я відповідного аргументу.
Позиційні і іменовані параметри можна довільно поєднувати:
Після імені поля може слідувати необов'язковий специфікатор формату '. '. З його допомогою можна управляти форматуванням значення. Наступний приклад залишає у числа Пі тільки три цифри після десяткового роздільника.
Після специфікатор '. 'Можна вказати число - мінімальну ширину поля, виражену в кількості символів. Це зручно використовувати для створення красивих таблиць:
Якщо ваша рядок з форматами дуже довга, а ви не хочете розбивати її на підрядка, було б непогано якби ви могли посилатися на змінні, призначені для форматування, не по позиції, а по імені. Це можна зробити, просто передавши словник і використовуючи квадратні дужки '[]' для збереження ключа.
Теж саме можна зробити, передавши словник іменованих параметрів, використовуючи нотацію "**":
Зокрема, такий прийом зручно використовувати в поєднанні з вбудованою функцією vars (). яка повертає словник з локальними змінними.
Детальний опис форматування рядків із застосуванням методу str.format () описано в розділі Синтаксис рядків форматування.
Форматування рядків в старому стилі
Для форматування рядків можна використовувати і операцію%. Вона інтерпретує лівий операнд як рядок форматування в стилі sprintf. яку слід застосувати до правий операнд, і повертає рядок, отриману в результаті цього перетворення. наприклад:
Оскільки метод str.format () досить новий, велика частина вихідних кодів Python все ще використовує операцію%. Однак, з часом, форматування рядків буде видалено з мови, тому в більшості випадків слід використовувати str.format ().
Більше інформації можна знайти в розділі Операції форматування рядків в старому стилі.
Запис і читання файлів
Функція open () повертає файловий об'єкт і в більшості випадків використовується з двома аргументами: open (имя_файла. Режим).
Перший параметр - рядок, що містить ім'я файлу. Другий - інший рядок, що містить кілька символів, що описують спосіб використання файлу. Значення параметра режим може бути символом 'r'. якщо файл буде відкритий тільки для читання, 'w' - відкритий тільки для запису (існуючий файл з таким же ім'ям буде стертий) і 'a' - файл відкритий для додавання: будь-які дані, записані в файл автоматично додаються в кінець. 'R +' відкриває файл і для читання, і для запису. Параметр режим необов'язковий: якщо він опущений - передбачається, що він дорівнює 'r'.
У звичайному випадку файли відкриваються в текстовому режимі (text mode) - це означає що ви читаєте з файлу і записуєте в файл рядки в певній кодуванні (за замовчуванням використовується UTF-8). Якщо додати до режиму файлу символ 'b', файл відкривається в двійковому режимі (binary mode): тепер дані зчитуються і записуються у вигляді двійкових об'єктів. Цей режим слід використовувати для всіх файлів, які не містять текст.
При використанні текстового режиму, все закінчення рядків, за замовчуванням, специфічні для платформи (\ n в Unix, \ r \ n в Windows) усікаються до символу \ n. при читанні з файлу, і конвертуються назад з \ n в вид, специфічний для платформи, під час запису в файл. Ці закулісні зміни в файлових даних коректно працюють в разі текстових файлів, але зіпсують двійкові дані в файлах на кшталт JPEG або EXE. Уважно стежте за тим, щоб використовувати двійковий режим при читанні і запису таких файлів.
Для позначення об'єктів файлів
У прикладах нижче мається на увазі, що заздалегідь створений файловий об'єкт з ім'ям f.
f.readlines () повертає список, що містить всі рядки з даними, виявлені в файлі. Якщо переданий необов'язковий параметр подсказка_размера. функція читає з файлу вказану кількість байт, плюс кілька байт понад те, достатню для завершення рядка, і формує список рядків з результату. Функція часто використовується для більш ефективного (файл не завантажується в пам'ять повністю) порядкового читання великих файлів. Повернуто будуть тільки повні (завершені) рядки.
Альтернативний спосіб порядкового читання - організація циклу по файловому об'єкту. Він швидкий, раціонально використовує пам'ять і має простий код в результаті:
Альтернативний спосіб простіше, але не надає тонкого контролю над тим, що відбувається. Оскільки обидва ці способи працюють з буферизацією рядків по-різному, їх не слід змішувати.
f.write (рядок) записує вміст рядка в файл і повертає кількість записаних байтів.
Щоб записати в файл щось відмінне від рядка, попередньо це щось потрібно в рядок сконвертировать:
f.tell () повертає ціле, що представляє собою поточну позицію в файлі f. виміряну в байтах від початку файлу. Щоб змінити позицію об'єкта-файлу, використовуйте f.seek (зміщення. Звідки). Позиція обчислюється додаванням зміщення до точки відліку; точка відліку вибирається з параметра звідки. Значення 0 параметра звідки відміряє зміщення від початку файлу, значення 1 застосовує поточну позицію в файлі, а значення 2 в якості точки відліку використовує кінець файлу. Параметр звідки може бути опущений і за замовчуванням встановлюється в 0. використовуючи початок файлу в якості точки відліку.
При роботі з текстовими файлами (відкритими без символу b в рядку режиму), виконувати позиціонування (seek) дозволяється тільки з початку файла (за винятком прокрутки в кінець файлу з використанням seek (0, 2)).
Коли ви закінчили всі дії над файлом, викличте f.close () щоб закрити його і звільнити все системні ресурси, використані при відкритті цього файлу. Всі спроби використовувати об'єкт-файл після виклику f.close () приведуть до виникнення виключення.
Вважається хорошою манерою використовувати ключове слово with при роботі з файловими об'єктами. Перевага цього способу в тому, що файл завжди коректно закривається після виконання блоку, або якщо при виконанні було породжене виняток. Крім того, що виходить код набагато коротше, ніж еквівалентна форма з блоками try - finally:
У об'єктів-файлів є ще кілька додаткових методів, таких як isatty () і truncate (). які використовуються не так часто; зверніться до Довідника по бібліотеці для більш повного огляду по файловим об'єктам.
модуль pickle
Замість того щоб примушувати програміста зі створенням та налаштуванням код для хитромудрих типів даних, Python надає стандартний модуль під назвою pickle. Це чудовий модуль, який може прийняти будь-який об'єкт Python (навіть деякі форми коду на Python!) І конвертувати його в строкове представлення: цей процес називається консервацією (pickling). Відновлення об'єкта з його строкового подання називається расконсервацией (unpickling): рядок, що описує об'єкт, може бути збережена в файл, додана до деякими даними, або відіслана за допомогою бездротової технології по мережі на віддалений комп'ютер.
Якщо у вас є певний об'єкт x і файловий об'єкт f. відкритий на запис в довічним режимі (binary mode, з параметром 'wb'), найпростіший спосіб законсервувати об'єкт вимагає однієї-єдиної рядки коду:
Щоб знову розконсервувати об'єкт, за умови що f - файловий об'єкт, відкритого для читання (так само в довічним режимі, з параметром 'rb'):
(Існують варіанти виконання цих операцій, що застосовуються при розконсервації декількох об'єктів або коли вам потрібно записати консервовані дані в файл; зверніться до документації по модулю pickle з Довідника по бібліотеці.)