Различия между версиями 17 и 18
Версия 17 от 2020-11-30 13:50:56
Размер: 5542
Редактор: FrBrGeorge
Комментарий:
Версия 18 от 2020-12-01 19:51:46
Размер: 5610
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 6: Строка 6:
  * <!> Задача_1: ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать, и вывести на стандартный вывод (вместе со стартовым байтом вначале)   * <!> Задача_1: ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале)

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

  • Просто файлы
    • текстовые и бинарные файлы (остальное вроде бы очевидно)
    • {i} поменять местами половины бинарного файла

    • Подготовка к Задаче_1. Программе в качестве параметров передаётся имя бинарного файла и количество «равных» по размеру (±1 байт) частей, на которые его надо разделить. Необходимо отсортировать эти части по возрастанию и записать обратно в файл
    • <!> Задача_1: ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале)

      • Бинарное чтение / запись — из потока sys.stdin.buffer и в sys.stdout.buffer

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

        $ echo -n qwerqwerqwerqwerqwerqwer | python3 sortb.py 
        qeeeeeeqqqqqrrrrrrwwwwww
  • Кодировки
    • отличие кодировок снаружи от unicode внутри Python
    • encdode().decode()

    • {i} добыть бнопню, бмхлюмхэ и охрюмхе (cp1251 и koi8-r)

    • <!> Задача_2: написать перекодировщик в UTF8 для следующей ситуации:

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

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

      • На входе — что-то типа «"áûë òåêñò íà ðóññêîì â êîäèðîâêå"»
      • На выходе — русский текст
      • Несоответствующие кодировке символы заменять на «"?"» (что .decode/encode умеет сам)
      • Минимум по одному тесту на два случая: есть или нет несоответствующих символов
  • Сериализация (если успеем)
    • простые примеры dump()/load()
    • поглядеть глазками protocol=0

  • Типизированные бинарные файлы
    • применение, язык описания структур
    • {i} Заполнить двоичный файл 10-ю случайными парами {  float, int }

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

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

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

      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 - 8 bytes, in 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.

    • phone.wav

      Size=108208, Type=1, Channels=2, Rate=44100, Bits=16, Data size=108172
    • Сделать минимум три теста:

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

      3. Неуспешный (заголовок прочтён, но строковые маркеры не совпадают)

LecturesCMC/PythonIntro2020/Prac/12_Files (последним исправлял пользователь FrBrGeorge 2020-12-01 19:51:46)