как узнать размер файла питон
Как получить расширение и размер файла в Python
Мы можем использовать функцию splitext() модуля os в Python, чтобы получить расширение файла. Эта функция разбивает путь к файлу на кортеж, имеющий два значения – корень и расширение.
Вот простая программа для получения расширения файла на Python.
Получение расширения файла с помощью модуля Pathlib
Мы также можем использовать модуль pathlib, чтобы получить расширение файла. Этот модуль был представлен в версии Python 3.4.
Всегда лучше использовать стандартные методы, чтобы получить расширение файла. Если вы уже используете модуль os, используйте метод splitext(). Для объектно-ориентированного подхода используйте модуль pathlib.
Получение размера файла
Мы можем получить размер файла в Python, используя модуль os.
Модуль os имеет функцию stat(), где мы можем передать имя файла в качестве аргумента. Эта функция возвращает структуру кортежа, содержащую информацию о файле. Затем мы можем получить его свойство st_size, чтобы получить размер файла в байтах.
Вот простая программа для печати размера файла в байтах и мегабайтах.
Если вы посмотрите на функцию stat(), мы можем передать еще два аргумента: dir_fd и follow_symlinks. Однако они не реализованы для Mac OS.
Вот обновленная программа, в которой я пытаюсь использовать относительный путь, но выдает NotImplementedError.
Python как узнать размер файла
Функция getsize() модуля os.path в Python.
Получить размер файла в байтах.
Синтаксис:
Параметры:
Возвращаемое значение:
Описание:
Примеры использования:
Как проверить размер файла в Python? – 9 Ответов
Другие ответы работают на реальные файлы, но если вам нужно что-то, что работает для «файловых объектов», попробуйте следующее:
Edit
Другое отличие между этим и os.stat() заключается в том, что вы можете stat() файл, даже если у вас нет разрешения на его чтение. Очевидно, что подход seek/tell не будет работать, если у вас нет разрешения на чтение.
Изменить 2
В предположении Джонатона, здесь параноидальная версия. (Версия выше оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать из файла, вы получите нулевые байты!)
Как проверить размер файла в python? (python)
Другие ответы работают на реальные файлы, но если вам нужно что-то, что работает для «файловых объектов», попробуйте следующее:
Edit
Другое отличие между этим и os.stat() заключается в том, что вы можете stat() файл, даже если у вас нет разрешения на его чтение. Очевидно, что подход seek/tell не будет работать, если у вас нет разрешения на чтение.
Изменить 2
В предположении Джонатона, здесь параноидальная версия. (Версия выше оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать из файла, вы получите нулевые байты!)
Получить размер файла перед загрузкой в Python
я воспроизвел то, что вы видите:
что я здесь делаю не так? Это ОС.stat ().st_size не возвращает правильный размер?
изменить: Хорошо, я понял, в чем проблема:
убедитесь, что вы открываете оба файла для бинарного чтения/записи.
автор: Jonathan Works
Вычисление размера каталога с помощью Python?
следующий скрипт печатает размер каталога всех подкаталогов для указанного каталога. Он также пытается извлечь выгоду (если это возможно) из кэширования вызовов рекурсивных функций. Если аргумент опущен, скрипт будет работать в текущем каталоге. Выходные данные сортируются по размеру каталога от самых больших до самых маленьких. Так вы можете приспособить его для ваших потребностей.
PS я использовал рецепт 578019 для показа размера каталога в удобном для человека формате (http://code.activestate.com/recipes/578019/)
EDIT: перемещен null_decorator выше, как рекомендовал user2233949
Как проверить размер файла в Python?
Другие ответы работают для реальных файлов, но если вам нужно что-то, что работает для «файловых объектов», попробуйте это:
редактировать
Редактировать 2
По предложению Джонатона, вот параноидальная версия. (Приведенная выше версия оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать файл, вы получите ноль байтов назад!)
Автор: Mark E. Haase Размещён: 29.09.2013 03:41
Получить размер файла в python тремя способами
Существуют разные методы получения размера файла в python, и в этой статье объясняются 3 из этих методов с примерами.
Определение размера файла становится важным, когда вы хотите отслеживать определенный файл на предмет ограничения размера или когда вы хотите упорядочить файлы в каталоге на основе их размера.
Приведенный выше код дает следующий результат
Размер файла 760 байт
Эта структура имеет множество свойств, из которых свойство st_size содержит размер файла (в байтах), присутствующего по указанному пути.
Пример,
Вывод этого кода следующий
Размер файла 760 байт
Как только мы получим объект, указывающий на файл, необходимо предпринять следующие шаги, чтобы узнать размер файла с помощью этого метода.
Пример,
Размер файла 760 байтов
Надеюсь, этот пост поможет вам в вычислении размера файла с использованием Python.
Получить размер файла перед загрузкой в Python
Я загружаю весь каталог с веб-сервера. Это работает нормально, но я не могу понять, как получить размер файла перед загрузкой, чтобы сравнить, был ли он обновлен на сервере или нет. Можно ли это сделать так, как если бы я загружал файл с FTP-сервера?
@Jon: спасибо за быстрый ответ. Это работает, но размер файла на веб-сервере немного меньше, чем размер загружаемого файла.
Это как-то связано с преобразованием CR / LF?
8 ответов
Я воспроизвел то, что вы видите:
Что я здесь не так делаю? Os.stat (). St_size не возвращает правильный размер?
Изменить: ОК, я понял, в чем проблема:
Убедитесь, что вы открываете оба файла для двоичного чтения / записи.
запрашивает решение на основе HEAD вместо GET (также печатает заголовки HTTP):
Использование
Это диктат, поэтому чтобы получить размер файла, вы должны urllibobject.info()[‘Content-Length’]
А чтобы получить размер локального файла (для сравнения), вы можете использовать команду os.stat ():
Размер файла отправляется как заголовок Content-Length. Вот как это сделать с помощью urllib:
Для подхода python3 (протестированного на 3.5) я бы порекомендовал:
@PabloG Относительно локальной / серверной разницы в размерах файлов
Ниже приводится пояснительное объяснение того, почему это может произойти:
Пример: когда файловая система разделена на блоки размером 512 байт, и нам нужно сохранить файл размером 600 байт, два блока будут заняты. Первый блок будет полностью использован, в то время как второй блок будет использовать только 88b, а оставшийся (512-88) b будет непригодным для использования, в результате чего размер файла на диске будет 1024b. Вот почему в Windows используются разные обозначения для «размера файла» и «размера на диске».
ПРИМЕЧАНИЕ: Существуют различные плюсы и минусы, которые приходят с меньшим / большим блоком FS, поэтому лучше поиграйте перед игрой с вашей файловой системой.
Также, если сервер, к которому вы подключаетесь, поддерживает его, посмотрите Etags и If-Modified-Since и If-None-Match.
Используя их, вы получите преимущества правил кэширования веб-сервера и вернете 304 статус не изменен. если содержание не изменилось.
Вычисление размера каталога с помощью Python?
прежде чем я заново изобрету это конкретное колесо, у кого-нибудь есть хорошая процедура для вычисления размера каталога с помощью Python? Было бы очень хорошо, если бы процедура отформатировала размер красиво в Mb/Gb и т. д.
24 ответов
это бросается в подкаталоги:
и oneliner для удовольствия с помощью os.listdir (не включает подкаталоги):
Обновлено Использовать os.путь.getsize не, это яснее, чем использование ОС.stat ().st_size метод.
спасибо ghostdog74 за указание на это!
обновить 2018
если вы используете Python 3.4 или предыдущий, вы можете использовать более эффективный walk метод, предоставленный третьей стороной scandir пакета. В Python 3.5 и позже этот пакет был включен в стандартную библиотеку и os.walk получил соответствующее увеличение производительности.
некоторые из предложенных до сих пор подходов реализуют рекурсию, другие используют оболочку или не будут производить аккуратно отформатированные результаты. Когда ваш код является одноразовым для платформ Linux,вы можете получить форматирование как обычно, включая рекурсию, в виде однострочного. За исключением print в последней строке, он будет работать на текущей версии python2 и python3 :
просто, эффективно и будет работать для файлов и многоуровневых каталогов:
немного поздно через 5 лет, но поскольку это все еще находится в хитлистах поисковых систем, это может помочь.
Использование памяти в Python
Сколько памяти занимает 1 миллион целых чисел?
Меня часто донимали размышление о том, насколько эффективно Python использует память по сравнению с другими языками программирования. Например, сколько памяти нужно, чтобы работать с 1 миллионом целых чисел? А с тем же количеством строк произвольной длины?
Как оказалось, в Python есть возможность получить необходимую информацию прямо из интерактивной консоли, не обращаясь к исходному коду на C (хотя, для верности, мы туда все таки заглянем).
Удовлетворив любопытство, мы залезем внутрь типов данных и узнаем, на что именно расходуется память.
Все примеры были сделаны в CPython версии 2.7.4 на 32 битной машине. В конце приведена таблица для потребности в памяти на 64 битной машине.
Необходимые инструменты
sys.getsizeof и метод __sizeof__()
Первый инструмент, который нам потребуется находится в стандартной библиотеки sys. Цитируем официальную документацию:
Возвращает размер объекта в байтах.
Если указано значение по умолчанию, то оно вернется, если объект не предоставляет способа получить размер. В противном случае возникнет исключение TypeError.
Getsizeof() вызывает метод объекта __sizeof__ и добавляет размер дополнительной информации, которая хранится для сборщика мусора, если он используется.
Алгоритм работы getsizeof(), переписанной на Python, мог бы выглядеть следующем образом:
Где PyGC_Head — элемент двойного связанного списка, который используется сборщиком мусора для обнаружения кольцевых ссылок. В исходном коде он представлен следующей структурой:
Размер PyGC_Head будет равен 12 байт на 32 битной и 24 байта на 64 битной машине.
Попробуем вызвать getsizeof() в консоли и посмотрим, что получится:
За исключением магии с проверкой флагов, все очень просто.
Как видно из примера, int и float занимают 12 и 16 байт соответственно. Str занимает 21 байт и еще по одному байту на каждый символ содержимого. Пустой кортеж занимает 12 байт, и дополнительно 4 байта на каждый элемент. Для простых типов данных (которые не содержат ссылок на другие объекты, и соответственно, не отслеживаются сборщиком мусора), значение sys.getsizeof равно значению, возвращаемого методом __sizeof__().
id() и ctypes.string_at
Теперь выясним, на что именно расходуется память.
Для этого нужно нам нужны две вещи: во-первых, узнать, где именно хранится объект, а во-вторых, получить прямой доступ на чтение из памяти. Несмотря на то, что Python тщательно оберегает нас от прямого обращения к памяти, это сделать все таки возможно. При этом нужно быть осторожным, так как это может привести к ошибке сегментирования.
Встроенная функция id() возвращает адрес памяти, где храниться начала объекта (сам объект является C структурой)
Чтобы считать данные по адресу памяти нужно воспользоваться функцией string_at из модуля ctypes. Ее официальное описание не очень подробное:
ctypes.string_at(адрес[, длина])
Это функция возвращает строку, с началом в ячейки памяти «адрес». Если «длина» не указана, то считается что строка zero-terminated,
Теперь попробуем считать данные по адресу, который вернул нам id():
Вид шестнадцатеричного кода не очень впечатляет, но мы близки к истине.
Модель Struct
Для того чтобы представить вывод в значения, удобные для восприятия, воспользуемся еще одним модулем. Здесь нам поможет функция unpack() из модуля struct.
struct
Этот модуль производит преобразование между значениями Python и структурами на C, представленными в виде строк.
struct.unpack(формат, строка)
Разбирает строку в соответствие с данным форматов. Всегда возвращает кортеж, даже если строка содержит только один элемент. Строка должна содержать в точности то количество информации, как описано форматом.
Форматы данных, которые нам потребуются.
символ | Значение C | Значение Python | Длина на 32битной машине |
c | char | Строка из одного символа | 1 |
i | int | int | 4 |
l | long | int | 4 |
L | unsigned long | int | 4 |
d | double | float | 8 |
Теперь собираем все вместе и посмотрим на внутреннее устройство некоторых типов данных.
О формате значений несложно догадаться.
Первое число (373) — количество указателей, на объект.
Как видно, число увеличилось на единицу, после того как мы создали еще одну ссылку на объект.
Второе число (136770080) — указатель (id) на тип объекта:
Третье число (1) — непосредственно содержимое объекта.
Наши догадки можно подтвердить, заглянув в исходный код CPython
Здесь PyObject_HEAD — макрос, общий для всех встроенных объектов, а ob_ival — значение типа long. Макрос PyObject_HEAD добавляет счетчик количества указателей на объект и указатель на родительский тип объекта — как раз то, что мы и видели.
Float
Число с плавающей запятой очень похоже на int, но представлено в памяти C значением типа double.
В этом легко убедиться:
Строка (Str)
Строка представлена в виде массива символов, оканчивающимся нулевым байтом. Также в структуре строки отдельного сохраняется ее длина, хэш от ее содержания и флаг, определяющий, хранится ли она во внутреннем кэше interned.
Макрос PyObject_VAR_HEAD включает в себя PyObject_HEAD и добавляет значение long ob_ival, в котором хранится длина строки.
Четвертое значение соответствует хэшу от строки, в чем нетрудно убедиться.
Как видно, значение sstate равно 0, так что строка сейчас не кэшируется. Попробуем ее добавить в кэш:
Кортеж (Tuple)
Кортеж представлен в виде массива из указателей. Так как его использование может приводить к возникновению кольцевых ссылок, он отслеживается сборщиком мусора, на что расходуется дополнительная память (об этом нам напоминает вызов sys.getsizeof())
Структура tuple похоже на строку, только в ней отсутствуют специальные поля, кроме длины.
Как видим из примера, последние три элементы кортежа являются указателями на его содержимое.
Остальные базовые типы данных (unicode, list, dict, set, frozenset) можно исследовать аналогичным образом.
Что в итоге?
Тип | Имя в CPython | формат | Формат, для вложенных объектов | Длина на 32bit | Длина на 64bit | Память для GC* |
Int | PyIntObject | LLl | 12 | 24 | ||
float | PyFloatObject | LLd | 16 | 24 | ||
str | PyStringObject | LLLli+c*(длина+1) | 21+длина | 37+длина | ||
unicode | PyUnicodeObject | LLLLlL | L*(длина+1) | 28+4*длина | 52+4*длина | |
tuple | PyTupleObject | LLL+L*длина | 12+4*длина | 24+8*длина | Есть | |
list | PyListObject | L*5 | L*длину | 20+4*длина | 40+8*длина | Есть |
Set/ frozenset | PySetObject | L*7+(lL)*8+lL | LL* длина | ( 5 элементов) 100+8*длина | ( 5 элементов) 200+16*длина | Есть |
dict | PyDictObject | L*7+(lLL)*8 | lLL*длина | ( 5 элементов) 124+12*длина | ( 5 элементов) 248+24*длина | Есть |
* Добавляет 12 байт на 32 битной машине и 32 байта на 64 битной машине
Мы видим, что простые типы данных в Python в два-три раза больше своих прототипов на C. Разница обусловлена необходимостью хранить количество ссылок на объект и указатель на его тип (содержимое макроса PyObject_HEAD). Частично это компенсируется внутренним кэшированием, который позволяет повторно использовать ранее созданные объекты (это возможно только для неизменяемых типов).
Для строк и кортежей разница не такая значительная — добавляется некоторая постоянная величина.
А списки, словари и множества, как правило, занимают больше на 1/3, чем необходимо. Это обусловлено реализацией алгоритма добавления новых элементов, который приносит в жертву память ради экономии времени процессора.
Итак, отвечаем на вопрос в начале статьи: чтобы сохранить 1 миллион целых чисел нам потребуется 11.4 мегабайт (12*10^6 байт) на сами числа и дополнительно 3.8 мегабайт (12 + 4 + 4*10^6 байт) на кортеж, которых будет хранить на них ссылки.
UPD: Опечатки.
UPD: В подзаголовке «1 миллион целых чисел», вместо «1 миллион простых чисел»