Размер — важная характеристика любого файла. В нашей стране, согласно ГОСТ 8.417-2002, объём информации измеряется в следующих единицах:
- бит (б)
- Байт (Б) = 8 бит
- Килобайт (КБ) = 1024 Б
- Мегабайт (МБ) = 1024 КБ
- Гигабайт (ГБ) = 1024 МБ
Напишите программу, которая вычисляет объём заданного файла.
Формат ввода
Вводится одно имя файла.
Формат вывода
Выведите объём файла в соответствующих единицах измерения.
При получении дробного значения, произведите округление вверх.
Примечание
Для решения данной задачи вы можете пойти двумя путями:
- изучите чтение файлов в побайтном режиме;
- изучите стандартную библиотеку
os
.
Пример
Ввод
# Пользовательский ввод
file.txt
# Содержимое файла file.txt
Этот файл весит больше чем кажется ))
Вывод
67Б
Ввод
# Пользовательский ввод
another_file.txt
# Содержимое файла another_file.txt
Хотелось бы сделать пример с файлом больше 1КБ
Не переживайте, такой обязательно будет в скрытых тестах ))
Вывод
193Б
Решение
В целом задача достаточно простая – проверяем крайние максимальные размеры (килобайт, мегабайт, гигабайт) в порядке возрастания или убывания и находим тот, в котором наша сумма будет находиться в диапазоне от 1 до 1024 (1023). После чего проверяем есть ли у числа “хвостик”, и если есть, то прибавляем единичку.
Единственный вопрос, который может внести путаницу – 1024 байта надо писать как 1КБ или 1024Б? Судя по всему, у Яндекса нет тестов связанных с этими значениями, потому что тест проходят оба варианта написания.
Посмотреть код
Решение
file_name = input()
with open(file_name, 'rb') as file:
data = file.read()
size = len(data)
scale = ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ']
weight = 0
while size > 1024 and weight < len(scale):
weight += 1
size, overload = divmod(size, 1024)
size += int(overload > 0)
print(f'{size}{scale[weight]}')
Решение
import os
file_name = input()
size = os.path.getsize(file_name)
scale = ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ']
weight = 0
while size > 1024 and weight < len(scale):
weight += 1
size, overload = divmod(size, 1024)
size += int(overload > 0)
print(f'{size}{scale[weight]}')