Странное поведение при записи и чтении файла

При выполнении следующего кода после второго чтения файл заполняется нулями до размера 4096 байт. Я могу'не могу понять, почему:

f = open("file.txt", "w+")
f.read()
# gives ''
f.write("Hello")
f.read()
# filled with \x00,\x00
f.close()
# file is 4096 bytes large...
 Blender26 окт. 2012 г., 10:14
Пытатьсяr+ вместо .w+
 Fabian26 окт. 2012 г., 10:13
Как вы измеряете размер файла?
 Lapin-Blanc26 окт. 2012 г., 10:29
Маркус: ям на Win7, Python 2.7, IDLE
 Marcus26 окт. 2012 г., 10:24
Я не'получить результат на моей машине, чтоВаша платформа?
 Lapin-Blanc26 окт. 2012 г., 10:36
Только что попробовал на моей Fedora, без проблем;)
 Lapin-Blanc26 окт. 2012 г., 10:19
Фабиан: Я делаю это с моей операционной системой Blender: тот же результат с пустым файлом и r + (я использую w + в примере, чтобы создать файл, если его нет)
 Paolo Moretti26 окт. 2012 г., 10:25
Я думаю, что вы не можетеread() послеwrite() безflush() между.
 Lapin-Blanc26 окт. 2012 г., 10:31
Паоло, это 'правда, что если яя делаю это, я нея больше не могу так себя вести ... все же странно, но любой указатель на то, что ты можешьчитать после записи?
 user70765026 окт. 2012 г., 10:29
Какая ОС? Как и Маркус, я могуВоспроизвести это на Linux, x86-64.

Ответы на вопрос(2)

Решение Вопроса

read() а также .write()

В противном случае: послеwrite()использоватьseek() до второгоread() читать твой файлс начала:

f = open("file.txt", "w+")
print f.read()      # prints ''
f.write("Hello")
f.seek(0)
print f.read()      # print 'Hello'
f.close()
 sloth26 окт. 2012 г., 10:40
@PaoloMoretti Правда. Также обратите внимание, что поведение кода OPs зависит от используемой ОС / файловой системы. Хотя код, вероятно, будет работать в Linux с Ext3 / Ext4, его использование в Win7 с NTFS приведет к куче мусора, записанного в файл.

Я не совсем в курсе деталей, но вполне вероятно, что 4096 байт (т.е. ровно 4 КБ) - это минимальный размер файла в вашей файловой системе и разделе. AFAIK, раздел имеет размер блока (часто 4096 байт), и файлы могут быть распределены только по целым блокам. Таким образом, файл всегда кратен 4096 байтам. Я думаю, что некоторые файловые системы имеют способ обойти это (например, reiserfs) путем объединения небольших файлов.

Ваш ответ на вопрос