Метод 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,
который создает файл из строки или байтов