Размер — важная характеристика любого файла. В нашей стране, согласно ГОСТ 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]}')
Не пойму почему мой вариант не проходит на 23 проверке.
import math import os with open(input(), 'rb') as file: file.seek(0, os.SEEK_END) r = file.tell() if r <= 1024: print(f'{r}Б') elif 1024 < r <= 1024 ** 2: print(f'{math.ceil(r / 1024)}КБ') elif 1024 ** 2 < r <= 1024 ** 3: print(f'{math.ceil(r / 1024 ** 2)}MБ') elif 1024 ** 3 < r <= 1024 ** 4: print(f'{math.ceil(r / 1024 ** 3)}ГБ') elif 1024 ** 4 < r: print(f'{math.ceil(r / 1024 ** 4)}ТБ')У вас в мегабайтах буква М английская.
Совет на будущее: копипасьте все из ТЗ. Так меньше шансов на ошибки и опечатки.
А еще посмотрите os.path.getsize(file_name)
Спасибо за помощь. Какая глупая ошибка. Пол дня убил пытаясь понять в чем проблема, даже не подумав в эту сторону. Как вы то ее нашли?
Запустил самодельное тестирование и заметил, что ругается на правильные ответы в мегабайтах.
Еще есть шрифты, в которых русские и латинские буквы выглядят по-разному. но мне они не нравятся.
Есть плагины, которые подсвечивают не-ASCII символы. Но тоже если только временно вкюлчать. Жить с этим невозможно.