2012-03-16 3 views
5

Это теоретический вопрос, так как я не имею реальную проблему, но я должен спросить ...Python - мелочь в огромный файл

Если бы я был огромного файла, скажем, много концертов долго, и я хотел изменить один байт, и я знал смещение этого байта, как я мог сделать это эффективно? Есть ли способ сделать это, не переписывая весь файл и записывая только один байт?

Я ничего не вижу в Python файл api, который позволит мне написать конкретное смещение в файле.

+2

http://docs.python.org/library/stdtypes.html#file.seek Вы устанавливаете позицию курсора с помощью функции seek(), затем пишите(), затем flush(), чтобы сохранить изменения. – shimofuri

ответ

8

До тех пор, пока вы не должны вставок или удалить байт, вы можете открыть файл в режиме "r+", используйте метод seek расположить объект файла в байте, чтобы изменить, и выписать один байт.

Возможно, более эффективно использовать операции нижнего уровня os.open, os.lseek, os.read, and os.write, которые не выполняют буферизацию на уровне приложений.

Если вам необходимо ввести или удалить байты, извините, вам не повезло: нет способа сделать это без перезаписи всего файла (с точки первой вставки или удаления). Это ограничение файловых API-интерфейсов POSIX (и AFAIK также Windows), а не Python.

+0

Наверняка вам нужно только написать файл из точки редактирования, а не весь файл? – Marcin

+0

Красивый ответ. Огромное спасибо! Но вы имели в виду переписывание «с точки зрения первого изменения», а не весь файл? Я просто ссылаюсь на ваш комментарий ниже. – fthinker

+0

Да, вы оба правы, я немного упрощал. (Стандартная техника для замены файла * атомарно * предполагает создание полной копии, поэтому часто люди просто так делают.) – zwol

2

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

+0

А, ок, связанный с этим, что, если я хочу вставить? В каждом случае (вставка/изменение) весь файл перезаписан или написан только один байт? Или это зависит только от fs? – fthinker

+4

Ни Unix (включая OSX), ни Windows (AFAIK) не предоставляет системные вызовы для вставки или удаления байтов из большого файла без перезаписи всего файла с момента первого изменения. – zwol

2

Ищите эту позицию в файле и пишите один байт. Файловые объекты в Python есть искать метод, который принимает в целое смещение от некоторой константы:

seek(offset[, whence]) 

откуда аргумент является необязательным и по умолчанию 0 (абсолютное позиционирование файла); другие значения равны 1 (искать относительно текущей позиции) и 2 (искать относительно конца файла).

0

Вот хороший учебник для того, что может понадобиться сделать: http://diveintopython3.ep.io/files.html#read

«искать» метод, чтобы найти байт вы хотите. Вышеприведенная ссылка говорит о предостережениях вы должны принять

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