Метод chunks

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

Синтаксис

pythonfile.chunks(chunk_size=8192)

Параметры:

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

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

pythonfrom 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 байт:

pythonfrom 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")

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

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

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

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

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

pythonfrom 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)

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

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

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

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

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

pythonfrom 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}")

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

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

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

  • класс File,
    который представляет файл в файловой системе
  • атрибут name,
    который возвращает имя файла
  • атрибут size,
    который возвращает размер файла в байтах
  • класс ContentFile,
    который создает файл из строки или байтов