редкое использование файлов в python

Я создаю разреженные файлы в python следующим образом:

>>> f = open('testfile', 'ab')
>>> f.truncate(1024000)
>>> f.close()

когда файл готов, он занимает 0 дискового пространства, но его размер inode установлен на мое усеченное значение (1000 КБ):

igor47@piglet:~/test$ ls -lh testfile 
-rw-r--r-- 1 igor47 igor47 1000K 2010-07-09 04:02 testfile
igor47@piglet:~/test$ du -hs testfile 
0   testfile

Как получить реальное использование пространства файла (выделенный размер) внутри python? Вызов stat возвращает видимый размер файла, и я понятия не имею, как еще получить реальное использование, кроме как прочитать весь файл (он может стать довольно большим)

>>> os.stat('testfile').st_size
1024000

person Igor Serebryany    schedule 09.07.2010    source источник
comment
кстати, если вы копируете разреженные файлы с помощью модуля Shutil Python, это не сработает, так как Shutil не поддерживает разреженные файлы.   -  person Igor Serebryany    schedule 14.07.2010


Ответы (1)


>>> os.stat('testfile').st_blocks*512
0

Тадаа :)

st_blocks — это количество 512-байтовых блоков, фактически выделенных для файла. Обратите внимание, что st_blocks не обязательно присутствует во всех операционных системах, но обычно присутствует в тех, которые поддерживают разреженные файлы.

person wump    schedule 09.07.2010
comment
st_blksize предоставляет фактический размер блока файловой системы. Вообще говоря, это не должно быть 512 байт. - person SilentGhost; 09.07.2010
comment
Я был сбит с толку на мгновение, но это неправда. st_blksize — предпочтительный размер блока файловой системы. st_blocks гарантированно будет состоять из блоков по 512 байт (см. man-страницу). - person wump; 09.07.2010
comment
Это конкретное решение работало сегодня утром, но после того, как я сменил серверную машину, оно внезапно перестало работать. Есть ли у вас какие-либо советы по этому поводу? - person Hgeg; 08.10.2012