← Назад к вопросам

В чем разница между текстовым и бинарными файлами?

1.0 Junior🔥 101 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между текстовыми и бинарными файлами

На уровне ОС все файлы — это просто последовательности байтов. Разница в том, как мы их интерпретируем.

Текстовый файл

Определение: файл, содержащий только символы, которые можно представить текстом. Обычно используется кодировка UTF-8, ASCII, или другая.

Примеры: .txt, .py, .json, .xml, .csv, .html

Как выглядит на диске:

Файл: hello.txt
Содержимое: Hello World

Байты: 48 65 6C 6C 6F 20 57 6F 72 6C 64
ASCII:  H  e  l  l  o  (space) W  o  r  l  d

Работа с текстовыми файлами в Python:

# Чтение
with open('hello.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)  # "Hello World"

# Запись
with open('hello.txt', 'w', encoding='utf-8') as f:
    f.write("Hello World")

# Построчно
with open('hello.txt', 'r') as f:
    for line in f:
        print(line.strip())

Режимы:

  • 'r' — чтение текста
  • 'w' — запись текста
  • 'a' — добавление в конец текста

Бинарный файл

Определение: файл, содержащий произвольные байты, не обязательно представимые как текст. Каждый байт — это просто число 0-255.

Примеры: .jpg, .png, .exe, .pdf, .zip, .mp3, .db

Как выглядит на диске:

Файл: image.jpg
Первые байты: FF D8 FF E0 00 10 4A 46 49 46 00 01
(JPEG заголовок)

Работа с бинарными файлами в Python:

# Чтение
with open('image.jpg', 'rb') as f:
    data = f.read()
    print(type(data))  # <class 'bytes'>
    print(data[:4])  # b'ÿØÿà'

# Запись
with open('image_copy.jpg', 'wb') as f:
    f.write(data)

# Частями (для больших файлов)
with open('large.bin', 'rb') as f:
    while True:
        chunk = f.read(1024)  # Читаем по 1KB
        if not chunk:
            break
        process(chunk)

Режимы:

  • 'rb' — чтение бинарных данных
  • 'wb' — запись бинарных данных
  • 'ab' — добавление бинарных данных

Ключевые отличия

АспектТекстовыйБинарный
Тип данныхstrbytes
КодировкаUTF-8, ASCII и т.д.N/A
Режим'r', 'w', 'a''rb', 'wb', 'ab'
Line ending
(LF) или
(CRLF)Нет обработки
РазмерМожет быть меньше на дискеТочный размер
СжатиеЧасто текст сжимаетсяМожет быть любое
Поиск текстаЛегко искать содержимоеСложнее

Обработка line endings

Текстовый файл — автоматическая конвертация:

# На Windows: 

# На Linux/Mac: 


with open('file.txt', 'r') as f:
    content = f.read()
    # Автоматически преобразуется в 
 на всех ОС

Бинарный файл — без преобразования:

with open('file.bin', 'rb') as f:
    data = f.read()
    # Ровно то, что на диске

Практические примеры

1. Читаем текстовый CSV

with open('data.csv', 'r', encoding='utf-8') as f:
    for line in f:
        fields = line.strip().split(',')
        print(fields)

2. Копируем бинарный файл (изображение)

with open('input.jpg', 'rb') as src:
    data = src.read()

with open('output.jpg', 'wb') as dst:
    dst.write(data)

# Или эффективнее для больших файлов:
with open('input.jpg', 'rb') as src:
    with open('output.jpg', 'wb') as dst:
        shutil.copyfileobj(src, dst)

3. Работа с JSON (текстовый формат)

import json

data = {'name': 'John', 'age': 30}

# Запись
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f)

# Чтение
with open('data.json', 'r', encoding='utf-8') as f:
    loaded = json.load(f)
    print(loaded)

4. Работа с бинарным форматом (pickle)

import pickle

data = {'name': 'John', 'age': 30}

# Сохранение (бинарное)
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

# Загрузка (бинарное)
with open('data.pkl', 'rb') as f:
    loaded = pickle.load(f)
    print(loaded)

Метаданные файла

import os

file_path = 'myfile.txt'

# Получить информацию
size = os.path.getsize(file_path)  # В байтах (одинаково для обоих)
print(f"Size: {size} bytes")

# Для текстового файла символов может быть меньше:
with open(file_path, 'r', encoding='utf-8') as f:
    content = f.read()
    print(f"Chars: {len(content)}")  # < size из-за кодировки

# Для бинарного файла:
with open(file_path, 'rb') as f:
    data = f.read()
    print(f"Bytes: {len(data)}")  # == size

Распознавание типа файла

def detect_file_type(file_path):
    with open(file_path, 'rb') as f:
        header = f.read(4)
    
    # Проверяем магические числа
    if header.startswith(b'%PDF'):
        return 'PDF'
    elif header.startswith(b'\xff\xd8\xff'):
        return 'JPEG'
    elif header.startswith(b'PK'):
        return 'ZIP'
    else:
        # Пробуем интерпретировать как текст
        try:
            header.decode('utf-8')
            return 'TEXT'
        except:
            return 'BINARY'

print(detect_file_type('image.jpg'))  # JPEG
print(detect_file_type('data.json'))  # TEXT (скорее всего)

Ошибки при путанице режимов

Ошибка 1: читаешь бинарный как текстовый

# file.jpg открыт как текстовый
with open('file.jpg', 'r') as f:
    content = f.read()
# ❌ UnicodeDecodeError: 'utf-8' codec can't decode byte

Ошибка 2: читаешь текстовый как бинарный

with open('file.txt', 'rb') as f:
    content = f.read()
# ✓ Работает, но content = bytes, нужно content.decode('utf-8')

Ошибка 3: забыл режим

# По умолчанию текстовый
with open('file.jpg', 'r') as f:  # Неправильно для изображения
    data = f.read()

Производительность

# Текстовый файл — медленнее (парсинг кодировки)
with open('large.txt', 'r', encoding='utf-8') as f:
    content = f.read()  # ~100ms для 100MB

# Бинарный — быстрее (прямой доступ)
with open('large.bin', 'rb') as f:
    data = f.read()  # ~50ms для 100MB

Заключение

  • Текстовые файлы: содержат читаемый текст, автоматически обрабатываются line endings, кодировка-зависимые
  • Бинарные файлы: могут содержать что угодно, требуют правильной интерпретации, быстрее для больших объёмов

Выбирай правильный режим открытия файла ('r'/'w' vs 'rb'/'wb') — это критично для корректной работы программы.

В чем разница между текстовым и бинарными файлами? | PrepBro