Що означає "wb" у цьому коді, використовуючи Python?


107

Код:

file('pinax/media/a.jpg', 'wb')

Також слід розглянути можливість використання openзамість file. fileбув застарілий у Python 2 (не вдалося знайти версію) та був видалений у py3k. (дякую Скотту) Дивіться це питання для отримання додаткової інформації.
Луїз Дамім

1
Використовуйте openзамість file, який був застарілим в Python 2 і видалені в Python 3. Див stackoverflow.com/questions/112970 / ...
Макс Ghenis

2
Не дуже справедливо вважати, що це власний кодекс ОП, особливо з огляду на характер питання. Воно було очевидно дійсним свого часу.
mckenzm

Відповіді:


112

Режим файлів , запис і двійковий. Оскільки ви пишете .jpg файл, це виглядає чудово.

Але якщо ви повинні прочитати цей jpg-файл, який вам потрібно використовувати 'rb'

Більше інформації

У Windows, доданий до режиму 'b', відкриває файл у двійковому режимі, тому є також такі режими, як 'rb', 'wb' та 'r + b'. Python в Windows робить різницю між текстовими та бінарними файлами; символи кінця рядка в текстових файлах автоматично незначно змінюються, коли дані читаються чи записуються. Ця закулісна модифікація файлових даних добре підходить для текстових файлів ASCII, але вона може пошкодити бінарні дані, такі як у файлах JPEG або EXE.


4
Конкретніше, в Windows файл, відкритий у текстовому режимі, fd.write("foo\n")фактично пише на диск foo\r\n(зверніть увагу на \r).
Серж Баллеста

4
Я впевнений, що "b" відкриває файли у двійковому режимі на будь-якій платформі, а не лише в Windows, і тут також буде величезний застереження.
mckenzm

76

wbВказує , що файл відкритий для запису в довічним режимі.

Під час запису у двійковому режимі Python не вносить жодних змін до даних, оскільки вони записуються у файл. У текстовому режимі (коли bвиключається, як у просто, wабо коли ви вказуєте текстовий режим за допомогою wt), Python буде кодувати текст на основі кодування тексту за замовчуванням. Крім того, Python буде конвертувати закінчення рядків ( \n) у будь-яке закінчення для певної платформи, що може пошкодити двійковий файл, як exeабо pngфайл.

Отже, текстовий режим слід використовувати під час запису текстових файлів (будь то звичайний текст або текстовий формат, як CSV), тоді як двійковий режим повинен використовуватися під час запису нетекстових файлів, таких як зображення.

Список літератури:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open


1
Це може змінитися з часом. У Ubuntu 18.04 під керуванням Python 3.6.8 'двійковий режим' безумовно мав значення. У мене з'явилася помилка при спробі запису до текстового файлу (формат CSV, не те, що в кінцевому рахунку має велике значення), який було відкрито за допомогою wbпараметра. Використовуючи wопцію замість цього, я зміг змусити її нормально працювати.
TheDavidJohnson

1
Дякуємо за Ваш коментар @TheDavidJohnson. Ще в Python 2.6 документи розповідали, що bрежим впливає лише на Windows. Тепер це було вилучено з документації, а двійковий режим "повинен використовуватися для всіх файлів, які не містять тексту".
Даніель Г

1
Звичайно, @Daniel! Я вдячний, що ви опублікували своє рішення. Більше 9 років потому це все ще корисно. Наскільки це здорово? У будь-якому випадку, я просто хотів додати нову інформацію для інших, таких як я, які, можливо, все-таки знайдуться і вважають це корисним. Ура!
TheDavidJohnson

Чудове пояснення. Однак, одне уточнення: ви кажете "Тому текстовий режим слід використовувати при написанні текстових файлів" . Для повноти я б посилався на ваш попередній коментар, що "Python не вносить змін [у двійковому режимі]", і додаю, що ви використовували б бінарний режим у текстовому файлі, коли або не знаєте (або дбаєте) про те, що таке кодування але просто потрібно прочитати або записати байти, або якщо ви хочете зберегти закінчення рядків незалежно від платформи.
pcdev

8

Це режим, в якому ви відкриваєте файл. "wb" означає, що ви записуєте у файл (w) і пишете у двійковому режимі (b).

Ознайомтеся з документацією для отримання додаткової інформації: clickic

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.