2015-11-01 2 views
1

Как открыть файл для чтения и записи, который также усечен до 0?Открыть файл для чтения и записи с усечением

Я пробовал:

f = open(PATH, 'w+') 

Я не могу читать из файла (f.read() возвращает пустую строку), однако.

также:

f = os.fdopen(os.open(PATH, os.O_RDWR | os.O_TRUNC), 'r+') 

же как поведение материала предыдущего код.

+0

Zed показывает, как это сделать в его бесплатной книге: http://learnpythonthehardway.org/book/ex16.html –

+0

@ the happy mamba: после 'truncate (0)', 'write()' вставляет некоторые странные символы перед написанием фактического содержания – someguy

ответ

9

Если вы хотите сохранить данные, то усечение использования r+:

with open(PATH,"r+") as f: 
    line = f.read() 
    f.seek(0) 
    f.truncate() 
+0

Это работает. Большое спасибо. – someguy

+0

@someguy, не беспокойтесь, вы могли бы использовать os.open, но это довольно просто, чтобы просто искать и усекать –

+0

вы можете рассказать мне, как из любопытства. Как вы можете видеть из моего вопроса, я попытался, но это не сработало. – someguy

7

Вот таблица режимов:

mode-string | truncate? | create? | what's allowed 
-------------+-----------+---------+---------------- 
    r  | no  | no  | reading (only) 
    w  | yes | yes | writing (only) 
    a  | no  | yes | writing (only), auto-appends 
    r+  | no  | no  | read and write 
    w+  | yes | yes | read and write 
    a+  | no  | yes | read and (auto-appending) write 

Обратите внимание, что есть недостающий режим ("читать и без авто append write, который не будет усекать, но будет создавать "). Если вы хотите этого, вы должны использовать функции os.

(Со всеми из них, добавить b к концу последовательности режима для работы на байт. Поведение без b зависит от python2 против Python3, а также возможность universal_newlines.)

В дополнение ко всему этому , переключение с «режима чтения» на «режим записи» или наоборот, на любой файл, открытый с помощью режима обновления +, требует операции поиска в большинстве случаев. См. this answer для получения дополнительной информации.


Edit: здесь различные os операции по открытию файлов, как определено для Unix-подобных систем:

os.open(path, flags, mode) 

path аргумент довольно очевиден, и mode аргумент используется только если файл (следовательно, может быть опущен, если вы не укажете флаг os.O_CREAT). Если вы делаете поставку mode, наиболее распространенное значение - 0666, что соответствует rw-rw-rw-. Пользовательский «umask» (см. os.umask) уберет ненужные разрешения, например, umask от 002 забирает окончательный бит записи, возвращаясь в rw-rw-r--, а 077 забирает все, кроме начального rw-. Два других общих режима: 0777 (rwxrwxrwx для исполняемых файлов) и 0600 (rw------- для пользовательских файлов, таких как временные файлы при работе с электронной почтой пользователя).

Значение flags должна включать в себя только один из os.O_RDONLY, os.O_WRONLY или os.O_RDWR: Открыть для чтения (только), писать (только), или обоих.

К этим словам, что вы можете добавить os.O_CREAT, что означает «создать файл, если он не существует»; os.O_TRUNC, что означает «обрезать файл до нулевого байта в длину немедленно»; и/или os.O_APPEND, что означает, что «все операции записи на уровне os неявно стремятся к текущему концу файла непосредственно перед записью».Там может (в зависимости от вкуса ОС) быть больше флагов, таких как O_EXCL, O_NDELAY, O_NOFOLLOW и более. (Тот, который, пожалуй, наиболее часто бывает полезным и надежным, это O_EXCL, что означает «сбой, если это откроет существующий файл» и, следовательно, действительно полезно в сочетании с O_CREAT. Используя эти два вместе, вы можете создать новый файл, который вы может гарантировать, что никакой другой процесс сотрудничества в системе также не будет использоваться. Флаг O_NOFOLLOW, если он существует, также полезен в некоторых контекстах безопасности, чтобы избежать симплексных ловушек.)

Во всех случаях, поставьте на уровне os, то есть O_RDONLY, O_WRONLY или O_RDWR. Если вы затем оберните дескриптор файла в поток Python с помощью os.fdopen, вы не сможете получить дополнительные полномочия, которые вы не предоставили себе по адресу open раз. Вы можете только вычесть часть, т. Е. Вы можете открыть с помощью O_RDWR, но затем fdopen поток как для чтения, так и для записи. Кроме того, при использовании fdopen с режимом обновления раздражающее ограничение, требующее операций поиска или скрытия между различными направлениями ввода/вывода, остается на месте.

Обратите внимание, что a (добавить) режим на fdopen уровне, если он повиновался вообще, является «менее мощным», чем в режиме O_APPEND (или с использованием режима a с open или io.open, все из которых приводят в установлении базового актива O_APPEND режим). Это в основном связано с взаимодействующими процессами, совместно использующими файл: если два или более таких процессов имеют файлы, открытые с помощью O_APPEND, пока их записи «достаточно малы» (детали снова меняются с ОС), их записи не будут смешиваться. Если файлы просто открываются как O_WRONLY или O_RDWR, два взаимодействующих процесса могут вызывать базовую функцию поиска, а затем основную функцию записи, но если они участвуют в гонке друг за другом, можно перезаписать данные другого.

(Некоторые флаги, в том числе O_APPEND, можно включить и выключить с помощью fcntl (от import fcntl) с F_SETFL аргумента. Это был сравнительно поздно дополнение к python2.)


«Добавить «здесь может означать буквальное дополнение, но использование побитового или | операций более условно. То есть, os.open(os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666), а не os.open(os.O_RDWR + os.O_CREAT + os.O_TRUNC, 0666).

+0

Я знаю функции 'os' -« что », но мне нужно« как ». В противном случае ваш ответ не будет действительно полезен. – someguy

+1

Что значит «как»? Выше * *, как, если вы не спрашиваете о функциях 'os' ... Aha, на вопрос Padraic Cunningham, вы имели в виду« как усечь в какой-то момент, учитывая, что вы недавно сделали некоторую операцию чтения или записи ». Я не понял этого вопроса. – torek

+0

Конечно, я спрашиваю, как использовать функции 'os' ... и вы не ответили ни на что, что я спросил до вашего редактирования. – someguy

Смежные вопросы