Як відкрити файл як для читання, так і для запису?


210

Чи є спосіб відкрити файл як для читання, так і для запису?

Як вирішення, я відкриваю файл для запису, закриваю його, а потім знову відкриваю для читання. Але чи є спосіб відкрити файл як для читання, так і для запису?


3
яку проблему ви вирішуєте? можливо, є краще рішення, ніж писати / читати файл, наприкладmmap
Роман Боднарчук

1
Чи можете ви дати нам свій код, щоб ми змогли відповісти вам. Можна також спробувати поглянути: docs.python.org/tutorial/… . Однак я намагався використовувати r + b, і це працює. Чи є користь використовувати один дескриптор файлів у різних функціях?
Арцьомій Рудзенка

@RomanBodnarchuk mmap- чудова ідея, але що робити, якщо вам доведеться мати справу з одночасністю? Чи є спосіб забронювати доступ?
Dr_Zaszuś

Відповіді:


267

Ось як ви читаєте файл, а потім записуєте в нього (перезаписуючи будь-які наявні дані), не закриваючи та не відкриваючи:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
використовувати a+для покриття кінцевого випадку, що файл не існує (буде створено)
Жозеф Харуш

16
шукати () і урізати () обидва критичні!
smwikipedia

4
@JossefHarush Зауважте, що документація для aстанів "на деяких системах Unix означає, що всі записи додаються до кінця файлу незалежно від поточної позиції пошуку". У цьому випадку f.seek(0)робота не буде працювати, як очікувалося. Я просто помилився на це в Linux.
Graeme

6
Краще поясніть, чому seekі truncateвживається тут. Більшість читачів походять з Google і роблять копію-вставлення.
Шиплу Мокаддім

8
Після того, як ви прочитали файл, покажчик файлу (fp) перемістився вперед, тому вам потрібно встановити його на початок. Ось що seek(0)це робить: він розміщує fp в положення 0( тобто початок). truncate()обрізати файл до заданої кількості байтів, тобто видаляє весь вміст файлу після вказаної кількості байтів. Уявіть, що у вашому файлі є рядок, Hello, worldі ви пишете Bye. Якщо ви цього не зробите, truncate()то в кінці Byelo, worldфайлу не буде видалено текст, який існував у файлі. truncate()обрізає файл до поточного fp.
Ілля Герасимчук

48

r+є канонічним режимом одночасного читання та письма. Це не відрізняється від використання fopen()системного виклику, оскільки file()/ open()це лише крихітна обгортка навколо цього виклику операційної системи.


він додає вміст файлу, а не записувати з початку
TomSawyer

47

Підсумуйте поведінку вводу / виводу

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

і галузь прийняття рішень

введіть тут опис зображення


Яке програмне забезпечення ви використовували для складання схеми дерева?
Flux

Мені теж було б цікаво - Діа?
nerdoc

22

Я спробував щось подібне, і це працює як слід:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Де:

f.read (size) - Щоб прочитати вміст файлу, зателефонуйте f.read (size), який зчитує деяку кількість даних і повертає їх у вигляді рядка.

І:

f.write (рядок) записує вміст рядка у файл, повертаючи None.

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

'r +' відкриває файл і для читання, і для запису.

У Windows, доданий до режиму 'b', відкриває файл у двійковому режимі, тому існують також такі режими, як 'rb', 'wb' та 'r + b'.


5
Крім того, читання, а потім написання, однаково добре працює у режимі 'r + b', але ви повинні використовувати f.seek (0) між f.read () та f.write (), щоб повернути курсор на початку файлу.
габоровий

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