Различия между версиями 6 и 7
Версия 6 от 2022-11-24 14:32:46
Размер: 7601
Редактор: FrBrGeorge
Комментарий:
Версия 7 от 2023-01-10 12:34:17
Размер: 7601
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 1: Строка 1:
= 11.25 Работа с файлами = = 11.22 Работа с файлами =

11.22 Работа с файлами

Просто файлы

  • текстовые и бинарные файлы (остальное вроде бы очевидно)
  • {OK} Открытие двоичного файла с русским текстом, чтение по байту оттуда

  • {i} поменять местами половины бинарного файла

  • {i} Вывести первую треть текстового файла, довыведя последнюю строку целиком (до "\n")

Кодировки

  • Кодировки — в файлах или I/O, а некий вариант unicode (UCS16) — внутри Python
    • locale.getdefaultlocale()

  • encdode() и .decode()

  • {i} преобразовать слово "вопрос" в "БНОПНЯ" с помощью encdode() и decode(), получить тем же способом "бМХЛЮМХЭ" и оХРЮМХЕ (используются кодировки cp1251 и koi8-r)

Сериализация

Pickle

  • {OK} простые примеры dump()/load()

  • {OK} поглядеть глазками protocol=0

  • B) сериализация экземпляра класса

  • {i} класс с сериализацией

    • реализуйте класс SerCls с полями lst (список), dct (словарь), num (число), st (строка)

    • cоздайте экземпляр ser этого класса с непустым наполнением всех полей

    • сериализуйте ser в строку, удалите ser

    • десериализуйте строку в новый экземпляр ser1 класса SerCls

Типизированные бинарные файлы

  • Применение, язык описания структур

  • {i} Заполнить двоичный файл 10-ю случайными тройками float, bytes[3], int

  • {i} Прочитать тройки float, bytes[3], int из файла, записать их в файл с сетевым порядком байтов

  • {OK} Сравним эти файлы (например, в linux с помощью hexdump -C или в python — binascii.hexlify(Bytes, ' '))

Д/З

  • <!> Задача_1:

    • Ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале).
    • Бинарное чтение / запись — из потока sys.stdin.buffer и в sys.stdout.buffer

    • Размер частей вычисляется динамически (если они неравны, пускай Питон сам округляет) по формуле i*L/N …(i+1)*L/N, где i — номер части, L — размер хвоста файла, а N — количество частей
    • Минимум по одному тесту на три случая: размер хвоста кратен, не кратен N, меньше N (тогда некоторые части просто пустые)

      • TODO Добавить более очевидный пример с '!'=33 и длинной строкой

      • Input: (без перевода строки в конце; первое q — это число 113)

      qwerqwerqwerqwerqwerqwer
      • Output:

      qeeeeeeqqqqqrrrrrrwwwwww
  • <!> Задача_2:

    • Написать перекодировщик в UTF8 для следующей ситуации:

      • был текст на русском в кодировке CP1251

      • этот текст был перекодирован в UTF8 как если бы он был в кодировке latin1 (типичная ситуация с mp3 тегами ID3v1)

    • На входе — что-то типа áûë òåêñò íà ðóññêîì â êîäèðîâêå

    • На выходе — русский текст
    • Несоответствующие кодировке символы заменять на «"?"» (что .decode/encode умеет сам)
    • Минимум по одному тесту на два случая: есть или нет несоответствующих символов
      • Input:

      ûë òåêñò íà ðóññêîì â êîäèðîâêå
      â êîâèä
      • Output:

      ыл текст на русском в кодировке
      в ковид
  • <!> Задача_3:

    • Вывести заголовок wav-файла (не весь, нужные поля отмечены (./) )

      • Size=…, Type=…, Channels=…, Rate=…, Bits=…, Data size=…

      • если это не WAV (проверить строковые маркеры), вывести "NO"
    • Сделать минимум три теста:

      1. Успешный (настоящий wav)
      2. Неуспешный (заголовок не распознаётся, например, потому что сам файл короче заголовка)

      3. Неуспешный (заголовок прочтён, но строковые маркеры не совпадают)
    • Структура 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):

      LecturesCMC/PythonIntro2021/Prac/10_Files/phone.wav

      • Output (1):

      Size=108208, Type=1, Channels=2, Rate=44100, Bits=16, Data size=108172
      • Input (2):

      logo_msu.svg

      • Output (2):

      NO

LecturesCMC/PythonIntro2022/Prac/11_Files (последним исправлял пользователь FrBrGeorge 2023-01-10 12:34:17)