Почему размер файла из GitHub всегда увеличивается на примерно 37% от указанного размера?

Как я могу создать функцию для скачивания файлов с отображением прогресса в процентах? У меня есть три файла на GitHub: 5mb.txt, 10mb.txt и 20mb.txt, и я пытаюсь их скачать.
  • 5 октября 2023 г. 9:27
Ответы на вопрос 2
Размер файла из GitHub не всегда увеличивается на 37% от указанного размера. Возможно, вы наблюдаете увеличение размера из-за использования сжатия данных при передаче файлов. Это может быть вызвано настройками сервера GitHub или другими факторами, связанными с протоколом передачи данных.

Для создания функции скачивания файлов с отображением прогресса в процентах вы можете использовать модуль requests в Python. Вот пример функции:

```python
import requests

def download_file(url, save_path):
    response = requests.get(url, stream=True)
    total_size = int(response.headers.get('content-length', 0))
    
    with open(save_path, 'wb') as file:
        downloaded_size = 0
        for data in response.iter_content(chunk_size=4096):
            downloaded_size += len(data)
            file.write(data)
            progress = downloaded_size / total_size * 100
            print(f"Downloaded {progress:.2f}%")
```

Вы можете использовать эту функцию для скачивания ваших файлов с GitHub следующим образом:

```python
download_file('https://github.com/username/repo/raw/main/5mb.txt', '5mb.txt')
download_file('https://github.com/username/repo/raw/main/10mb.txt', '10mb.txt')
download_file('https://github.com/username/repo/raw/main/20mb.txt', '20mb.txt')
```

Замените `'https://github.com/username/repo/raw/main/...'` вашей ссылкой на файлы.
event.loaded / data - неясно, поскольку не понятно, какое значение имеет data. 

event.total = 0 - это означает, что общий размер файла неизвестен. Прогресс загрузки будет приблизительным и будет зависеть от скорости загрузки, о которой решает браузер. 

lengthComputable = false - это означает, что общий размер файла не может быть определен. Это значение следует игнорировать.

Почему: https://stackoverflow.com/a/47287125/1603055 - в этом посте разъясняется, что файл вероятно передается в виде base64-кодированного текста. Также отмечается, что он может быть сжатым, но если файл содержит случайный текст, то он не будет сжат и будет передан в большем объеме. Рекомендуется анализировать заголовки, особенно Content-type, чтобы понять, что именно передается и в каком формате. Чтобы правильно отобразить прогресс, следует использовать Content-Length, если он доступен.

А вы сами то открывали файл по ссылке из data.git_url?Там отдаётся JSON с файлом, закодированным в Base64. В Base64 каждые 6 бит исходного файла кодируются одним символом (8 бит) текста, а после каждых 60 символов добавляется символ переноса строки. Вот и получаем ~ (2/6 + 8/360) = 35.6% дополнительно к объёму. Если хотите получить файл сам по себе, то используйте поле download_url.
Похожие вопросы