11.25 Работа с файлами
TODO Пример к Задача_1 как-то обыграть в тестере
Просто файлы
- текстовые и бинарные файлы (остальное вроде бы очевидно)
поменять местами половины бинарного файла
- Подготовка к Задаче_1. Программе в качестве параметров передаётся имя бинарного файла и количество «равных» по размеру (±1 байт) частей, на которые его надо разделить. Необходимо отсортировать эти части по возрастанию и записать обратно в файл
Задача_1:
- Ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале).
Бинарное чтение / запись — из потока sys.stdin.buffer и в sys.stdout.buffer
- Размер частей вычисляется динамически (если они неравны, пускай Питон сам округляет) по формуле i*L/N …(i+1)*L/N, где i — номер части, L — размер хвоста файла, а N — количество частей
Минимум по одному тесту на три случая: размер хвоста кратен, не кратен N, меньше N (тогда некоторые части просто пустые)
Пример вызова (под bash): $ echo -n <текст> | python3 sortb.py
Input:
qwerqwerqwerqwerqwerqwer
Output:
qeeeeeeqqqqqrrrrrrwwwwww
Кодировки
- отличие кодировок снаружи от unicode внутри Python
encdode().decode()
добыть бнопню, бмхлюмхэ и охрюмхе (cp1251 и koi8-r)
Задача_2:
Написать перекодировщик в UTF8 для следующей ситуации:
был текст на русском в кодировке CP1251
этот текст был перекодирован в UTF8 как если бы он был в кодировке latin1 (типичная ситуация с mp3 тегами ID3v1)
На входе — что-то типа áûë òåêñò íà ðóññêîì â êîäèðîâêå
- На выходе — русский текст
- Несоответствующие кодировке символы заменять на «"?"» (что .decode/encode умеет сам)
- Минимум по одному тесту на два случая: есть или нет несоответствующих символов
Input:
áûë òåêñò íà ðóññêîì â êîäèðîâêå
Output:
был текст на русском в кодировке
Сериализация
(если успеем)
- простые примеры dump()/load()
поглядеть глазками protocol=0
Типизированные бинарные файлы
- применение, язык описания структур
Заполнить двоичный файл 10-ю случайными парами { float, int }
Задача_3:
Вывести заголовок wav-файла (не весь, нужные поля отмечены )
Size=…, Type=…, Channels=…, Rate=…, Bits=…, Data size=…
- если это не WAV (проверить строковые маркеры), вывести "NO"
Сделать минимум три теста:
- Успешный (настоящий wav)
Неуспешный (заголовок не распознаётся, например, потому что сам файл короче заголовка)
- Неуспешный (заголовок прочтён, но строковые маркеры не совпадают)
- Структура wav-файла:
Positions off-by-1
Sample Value
Description
1 - 4
"RIFF"
Marks the file as a riff file. Characters are each 1 byte long.
5 - 8
File size (integer)
Size of the overall file in bytes - 4 bytes (32-bit integer). Typically, you'd fill this in after creation.
9 -12
"WAVE"
File Type Header. For our purposes, it always equals "WAVE".
13-16
"fmt "
Format chunk marker. Includes trailing null
17-20
16
Length of format data as listed above
21-22
1
Type of format (1 is PCM) - 2 byte integer
23-24
2
Number of Channels - 2 byte integer
25-28
44100
Sample Rate - 32 byte integer. Common values are 44100 (CD), 48000 (DAT). Sample Rate = Number of Samples per second, or Hertz.
29-32
176400
(Sample Rate * BitsPerSample * Channels) / 8.
33-34
4
(BitsPerSample * Channels) / 8.1 - 8 bit mono2 - 8 bit stereo/16 bit mono4 - 16 bit stereo
35-36
16
Bits per sample
37-40
"data"
"data" chunk header. Marks the beginning of the data section.
41-44
File size (data)
Size of the data section.
Input (1):
Output (1):
Size=108208, Type=1, Channels=2, Rate=44100, Bits=16, Data size=108172
Input (2):
Output (2):
NO