Різниця між режимами a, a +, w, w + і r + у вбудованій відкритій функції?


608

У Пітоні вбудованого відкритої функції, яка точна різниця між режимами w, a, w+, a+, і r+?

Зокрема, з документації випливає, що все це дозволить записати у файл, і каже, що воно відкриває файли для "додавання", "написання" та "оновлення" конкретно, але не визначає, що означають ці терміни.


11
Надане вами посилання точно визначає значення. Яку частину посилання, яке ви надали, ви не могли бачити чи розуміти? Чи можете ви уточнити своє запитання, щоб пояснити, що ви не розуміли про посилання?
С.Лотт

@ChrisB. - Я повідомив про це як про помилку на bugs.python.org/issue19627
Bulwersator

2
чи не існує простого та єдиного документа, який пояснює, що означає знак +?
Чарлі Паркер

Відповіді:


740

Режими відкриття точно такі ж, як і для стандартної функції C бібліотеки fopen().

BSD fopenсторінка керівництво визначає їх таким чином :

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.

3
Я вважаю, ви маєте на увазі виклик fopen у стандартній бібліотеці C (який не є системним дзвінком)
Eli Courtwright,

14
ПРИМІТКА: Python v3 додає ряд додаткових режимів. посилання на документи
Алекс

5
Зауважив, що це може зробити wі те, і w+іншеThe file is created if it does not exist
Вей Ян

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

6
я правий сказати, що +не робить щось послідовне незалежне, чи є a, wчи r? Або я не бачу картини? Яка закономірність?
Чарлі Паркер

509

Я зауважив, що раз у раз мені потрібно знов сфотографувати Google, аби лише створити уявний образ того, у чому полягають основні відмінності між режимами. Отже, я думав, що діаграму буде швидше прочитати наступного разу. Можливо, хтось інший теж знайде це корисне.


3
aОпис неправильно . Записи завжди розташовані в кінці.
Антті Хаапала

10
@ І я вважаю, що @Antti має на увазі властивість, Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similarяка є дещо сильнішою, ніж просто сказати, що початкове положення - це кінець.
jcai

8
@CharlieParker Про те, що в основному є дві файлові операції (читання, запис). Режим r насамперед для читання, режими w , a - це насамперед для запису. А знак плюс дає змогу здійснити другу операцію в заданому режимі (просто сказано).
Jeyekomon

22
Для нащадків: усікати означає перезаписати з початку.
Мінь Тран

4
@Jeyekomon Ваше резюме у вашому коментарі тут, мабуть, єдина найкорисніша річ, яку я читав, намагаючись обійти ці режими так, що я зараз можу запам’ятати! Діаграма в цій відповіді прекрасна, а таблиця у відповіді нижче - чудова, але якщо ці відповіді (та інші в інших місцях) почалися з цього простого пункту і попрацювали звідти, це допоможе забезпечити набагато кращу розумову основу для вивішування деталей на. Тож спасибі (Я знаю, що це можливо на кордоні спаму, але я вважав, що ваш коментар заслужив підтвердження) 💯
Тім,

206

Та сама інформація, лише у формі таблиці

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

де значення: (тільки щоб уникнути помилок)

  • читати - читання з файлу дозволено
  • запис - запис у файл дозволено

  • create - файл створюється, якщо він ще не існує

  • trunctate - під час відкриття файлу він залишається порожнім (весь вміст файла стирається)

  • позиція на початку - після відкриття файлу початкове положення встановлюється на початок файлу

  • позиція в кінці - після відкриття файлу початкове положення встановлюється в кінці файлу

Примітка: aі a+завжди додавати до кінця файлу - ігнорує будь-які seekрухи.
До речі. цікава поведінка принаймні на моєму win7 / python2.7 для нового файлу, відкритого в a+режимі:
write('aa'); seek(0, 0); read(1); write('b')- другий writeігнорується
write('aa'); seek(0, 0); read(2); write('b')- другий writeпіднімаєIOError


10
Чому не існує "Створити файл, якщо його не існує. Якщо він існує, поставте його на початку, включіть читання і запис"? Це найочевидніший варіант для мене: я зберігаю дані у файлі. Якщо файлу немає, створіть його замість помилки. Якщо у файлі є дані, я хочу прочитати все це зверху, оновіть деякі речі, а потім повністю перепишіть файл із 0 за наступного часу, коли я його завантажую. Я використовую open(file,'a'); close(); open(file,'r+')для цього.
pinhead

2
Що означає "обрізання" в цьому контексті?
Чарлі Паркер

3
@CharlieParker Це означає, що весь вміст файлу стирається (файл робиться порожнім)
industryworker3595112

1
Ви можете додати зауваження, що з aі записом завждиa+ буде відбуватися в кінці файлу, незалежно від того, чи переміщується вказівник вручну . seek()
balu

1
А що з оновленням таблиці, щоб включити "x" для Python 3?
Нікос Олександріс

39

Параметри такі ж, як і для функції fopen у стандартній бібліотеці C:

w обрізає файл, переписуючи все, що вже було

a додає до файлу, додаючи до того, що вже було

w+ відкривається для читання та запису, обрізання файлу, але також дозволяє прочитати назад те, що було записано у файл

a+ Відкривається для додавання та читання, що дозволяє вам додавати файл, а також читати його вміст


2
Що означає "обрізання" в цьому контексті? Чи означає це видалити старі дані, якщо їх було? Або щось інше більш конкретне?
Чарлі Паркер

3
@CharlieParker: Правильно - це означає, що всі дані в існуючому файлі будуть видалені, і ми починаємо писати з початку вже порожнього файлу.
Eli Courtwright

9

Я думаю, що це важливо враховувати для кросплатформного виконання, тобто як CYA. :)

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

Це безпосередньо цитата з 2.7.x Python Software Foundation , .


9

Я торкнувся цього, намагаючись з’ясувати, чому ви використовуєте режим 'w +' проти 'w'. Зрештою, я просто зробив тестування. Я не бачу особливої ​​мети для режиму 'w +', оскільки в обох випадках цей файл усікається для початку. Однак із знаком "w +" ви можете читати після написання, шукаючи назад. Якщо ви спробуєте будь-яке читання за допомогою "w", це призведе до виникнення IOError. Читання без використання пошуку в режимі 'w +' нічого не дасть, оскільки вказівник на файл буде знаходитись там, де ви написали.

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