РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
632 of 818 menu

Метод chunks

Метод chunks применяется к объекту File и возвращает генератор, который последовательно выдает фрагменты (чанки) данных указанного размера. Это особенно полезно при работе с большими файлами, так как позволяет обрабатывать их по частям, минимизируя потребление оперативной памяти. Размер чанка можно задать через параметр chunk_size.

Синтаксис

file.chunks(chunk_size=8192)

Параметры:

  • chunk_size - размер одного фрагмента в байтах (по умолчанию 8192 байт)

Пример . С моделью Document

Рассмотрим модель для хранения документов и прочитаем файл по частям:

from django.db import models class Document(models.Model): title = models.CharField(max_length=200) file = models.FileField(upload_to='documents/') created_at = models.DateTimeField(auto_now_add=True)

Получим файл и прочитаем его по частям размером 4096 байт:

from myapp.models import Document doc = Document.objects.get(id=1) with doc.file.open('rb') as file: for chunk in file.chunks(chunk_size=4096): print(f"Chunk size: {len(chunk)} bytes")

Результат выполнения кода:

"Chunk size: 4096 bytes" "Chunk size: 4096 bytes" "Chunk size: 2048 bytes"

Последний чанк может быть меньше указанного размера, если размер файла не кратен размеру чанка.

Пример . Обработка большого CSV файла

Обработаем большой CSV файл построчно, используя метод chunks для эффективного чтения:

from myapp.models import Document import csv from io import StringIO doc = Document.objects.get(title='data.csv') buffer = StringIO() with doc.file.open('rb') as file: for chunk in file.chunks(chunk_size=8192): buffer.write(chunk.decode('utf-8')) buffer.seek(0) reader = csv.reader(buffer) for row in reader: print(f"Processing row: {row}") buffer.truncate(0) buffer.seek(0)

Результат выполнения кода:

"Processing row: ['Name', 'Age', 'City']" "Processing row: ['Alice', '30', 'New York']" "Processing row: ['Bob', '25', 'Los Angeles']"

Такой подход позволяет обрабатывать файлы любого размера, не загружая их полностью в память.

Пример . Чтение и обработка изображения

Прочитаем изображение по частям и вычислим общий размер:

from myapp.models import Document image = Document.objects.get(title='photo.jpg') total_size = 0 chunk_count = 0 with image.file.open('rb') as file: for chunk in file.chunks(chunk_size=1024): total_size += len(chunk) chunk_count += 1 print(f"Chunk {chunk_count}: {len(chunk)} bytes") print(f"Total size: {total_size} bytes") print(f"Number of chunks: {chunk_count}")

Результат выполнения кода:

"Chunk 1: 1024 bytes" "Chunk 2: 1024 bytes" "Chunk 3: 512 bytes" "Total size: 2560 bytes" "Number of chunks: 3"

Смотрите также

  • класс File,
    который представляет файл в файловой системе
  • атрибут name,
    который возвращает имя файла
  • атрибут size,
    который возвращает размер файла в байтах
  • класс ContentFile,
    который создает файл из строки или байтов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить