Различия между версиями 3 и 4
Версия 3 от 2021-11-25 15:54:26
Размер: 5632
Редактор: hbd
Комментарий: Правка описания заголовка WAV
Версия 4 от 2021-12-01 04:02:48
Размер: 6355
Редактор: alryaz
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 2: Строка 2:

{{{#!wiki caution
'''TODO''' Пример к '''Задача_1''' как-то обыграть в тестере
}}}
Строка 7: Строка 11:
  * <!> Задача_1: ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале)   * <!> '''Задача_1:'''
   * В
вести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале).
Строка 11: Строка 16:
   {{{
$ echo -n qwerqwerqwerqwerqwerqwer | python3 sortb.py
   * Пример вызова (под bash): `$ echo -n <текст> | python3 sortb.py`

  '''Input:'''
  {{{
qwerqwerqwerqwerqwerqwer
  }}}

  '''Output:'''
  {{{
Строка 14: Строка 26:
  }}}   }}}
Строка 20: Строка 32:
  * <!> Задача_2: написать перекодировщик в `UTF8` для следующей ситуации:
   * был текст на русском в кодировке `CP1251`
   * этот текст был перекодирован в `UTF8` как если бы он был в кодировке `latin1` (типичная ситуация с mp3 тегами ID3v1)
   * На входе — что-то типа «"áûë òåêñò íà ðóññêîì â êîäèðîâêå
  * <!> '''Задача_2:'''
   * Н
аписать перекодировщик в `UTF8` для следующей ситуации:
  * был текст на русском в кодировке `CP1251`
  * этот текст был перекодирован в `UTF8` как если бы он был в кодировке `latin1` (типичная ситуация с mp3 тегами ID3v1)
   * На входе — что-то типа `áûë òåêñò íà ðóññêîì â êîäèðîâêå`
Строка 27: Строка 40:

  '''Input:'''
  {{{
áûë òåêñò íà ðóññêîì â êîäèðîâêå
  }}}

  '''Output:'''
  {{{
был текст на русском в кодировке
  }}}
Строка 37: Строка 60:
  * <!> Задача_3: Вывести заголовок [[http://www.topherlee.com/software/pcm-tut-wavformat.html|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 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.||
  * [[attachment:phone.wav]]
   →
  * <!> '''Задача_3:'''
   *
Вывести заголовок [[http://www.topherlee.com/software/pcm-tut-wavformat.html|wav-файла]] (не весь, нужные поля отмечены (./) )
    * `Size=…, Type=…, Channels=…, Rate=…, Bits=…, Data size=…`
  * если это не WAV (проверить строковые маркеры), вывести "NO"
   * Сделать ''минимум три'' теста:
    1. Успешный (настоящий wav)
    1. Неуспешный (заголовок не распознаётся, например, потому что сам файл ''короче'' заголовка)
    1. Неуспешный (заголовок прочтён, но строковые маркеры не совпадают)

   * Структура 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):'''

 
[[attachment:phone.wav]]
  
  '''Output (1):'''
Строка 58: Строка 92:
}}}
  * Сделать ''минимум три'' теста:
   1. Успешный (настоящий wav)
   1. Неуспешный (заголовок не распознаётся, например, потому что сам файл ''короче'' заголовка)
   1. Неуспешный (заголовок прочтён, но строковые маркеры не совпадают)
   
  }}}

  '''Input (2):'''

  [[https://lvk.cs.msu.su/sites/all/themes/professional_theme/logo_msu.svg|logo_msu.svg]]

  '''Output (2):'''
  {{{
NO
  }}}

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

TODO Пример к Задача_1 как-то обыграть в тестере

Просто файлы

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

  • Подготовка к Задаче_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()

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

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

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

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

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

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

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

    Input:

    áûë òåêñò íà ðóññêîì â êîäèðîâêå

    Output:

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

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

(если успеем)

  • простые примеры dump()/load()
  • поглядеть глазками protocol=0

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

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

  • <!> Задача_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):

    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/PythonIntro2021/Prac/10_Files (последним исправлял пользователь alryaz 2021-12-01 04:02:48)