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

Оператор with

Далее см. contextlib.html

Байтовые структуры

Bytearray нужен не очень часто:

бНОПНЯ

Как преобразовать из str в bytes и обратно?

Не всякие кодировки полны:"Вопрос".encode("koi8-r").decode("latin3")

Просто файлы

В tutorial

Отдельная тема: файлы в операционной системе, os, pathlib и т. д. — слишком много и не про язык, не будем туда ходить.

Стандартный ввод-вывод

Файловые объекты

Более высокий уровень абстракции — io (в действительности более низкий)

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

В просто файлы записываются только строки или байты. А если надо записать float, причём не в виде строки?

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

Чтение и запись объектов Python

Пример:

   1 >>> import pickle
   2 >>> pickle.dumps(0x14131211)
   3 b'\x80\x04\x95\x06\x00\x00\x00\x00\x00\x00\x00J\x11\x12\x13\x14.'
   4 >>> pickle.dumps(0x14131211)[-5:]
   5 b'\x11\x12\x13\x14.'
   6 >>> du = pickle.dumps(123.123e20)
   7 >>> du
   8 b'\x80\x04\x95\n\x00\x00\x00\x00\x00\x00\x00GD\x84\xdb\x9b\xe5\x05\x1cP.'
   9 >>> ud = pickle.loads(du)
  10 >>> ud
  11 1.23123e+22
  12 >>> F = open("serialized", "bw")
  13 >>> pickle.dump(100500, F)
  14 >>> pickle.dump([1, "WER", None], F)
  15 >>> pickle.dump(b"QWWER", F)
  16 >>> F.close()
  17 >>> F = open("serialized", "br")
  18 >>> pickle.load(F)
  19 100500
  20 >>> pickle.load(F)
  21 [1, 'WER', None]
  22 >>> pickle.load(F)
  23 b'QWWER'
  24 

Сериализация экземпляра класса:

Структуры типа Си

Что мешает записать / считать представление объекта в памяти — это и будет в точности его контент?

struct

Пример: заголовок PNG (возможно, не успеем)

Базы данных и dict-like итерфейс

dbm

Файлы с известной структурой

Д/З

Предполагается, что стандартный ввод в тестах — это файлы. Если для решения нужен .seek(), вводить с клаиатуры не получится. Можно запускать программу из консоли примерно так:

Собственно, задание:

  1. Прощёлкать примеры с файлами в Tutorial, а также примеры по pickle и struct

  2. EJudge: DeStruct 'Разбор пакета'

    На вход подаётся содержимое некоторого пакета данных — строка в формате base85. Пакет состоит из заголовка и тела. Заголовок содержит последовательность ненулевых байтов, заканчивающуюся нулевым. Каждый байт заголовка — число 1, -1, 2, -2, 4, -4, 8 или -8 (других нет). Модуль этого числа описывает количество байтов в очередном поле записи. Тело состоит из нуля или более записей, определяемых в заголовке. Если число отрицательное, соответствующее поле — целое со знаком, если положительное — беззнаковое. Выравнивания между полями и между записями нет. Порядок байтов — «сетевой» (big endian). Вывести сумму всех полей пакета.

    Input:

    1pod3sdqp1V;v|??MM2idn8p=)rm(+um
    Output:

    5599084740
  3. EJudge: LightBnopnya 'Случилась бНОПНЯ'

    Текст процедуры на языке Рапира в кодировке koi8-r был несколько раз перекодирован, причём перекодировщику сообщали совершенно произвольную исходную и целевую однобайтную кодировку (например, из cp866 в latin_1). Результат перекодировали из последней целевой кодировки в UTF-8 . Восстановить предполагаемый текст процедуры.

    • Известно, что в процессе перекодирования не возникало ошибок

    • Все буквы — заглавные русские; никаких других не-ASCII символов в тексте не было
    • Синтаксис внутри процедуры не соблюдается, но

      • процедура начинается на "ПРОЦ" и заканчивается на "КНЦ;"

      • внутри процедуры есть оператор "ВЫВОД: "

      • текущая формулировка задачи и набор тестов допускают неоднозначное декодирование. в 2022 году проблема лечится либо оптимальным декодированием (двойным вместо тройного), либо дополнительной проверкой на слово «ОСОВЕННОСТИ» — его не должно быть в ответе. TODO В будущем формулировку пересмотреть

    • Список допустимых кодировок: cp037 cp1006 cp1250 cp1251 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp437 cp720 cp737 cp775 cp850 cp852 cp855 cp864 cp866 cp869 cp874 cp875 hp_roman8 iso8859_10 iso8859_16 iso8859_4 iso8859_5 koi8_r latin_1 mac_croatian mac_greek mac_iceland mac_latin2

    • Максимальное количество перекодирований — 3
    • В процедуре не более 25 тысяч символов
    Input:

    ЪЫЩж ИЩЫЖРНЩ();
      ЭвЭЩН: "ЦЩкОЮ ЫЖРЭУЮУн ЩЗЫЖРЩЦ ТЬХЩЭУн ХУмЧЩЬЮУ."
        НЩ ЩЮ ЭЬО 0-8-6+4/ЭЬОЦ;
        ЪЫЩж ОЬХУ 6()6=7+6()3::
        ЭвЭЩН: "ЪЫУмОЦ 7."
        ЭвЭЩН: "ЭОЬд НЫТИ ЪЫЩОФЮЖ ЭЬОЦ ОЦТ ЪЫУСЩНУЮЬн?"
    ФЧж;
    Output:

    ПРОЦ ГОРАЗДО();
      ВЫВОД: "МОЖЕТ РАЗВИТИЯ ОБРАЗОМ УСЛОВИЯ ЛИЧНОСТИ."
        ДО ОТ ВСЕ 0-8-6+4/ВСЕМ;
        ПРОЦ ЕСЛИ 6()6=7+6()3::
        ВЫВОД: "ПРИЧЕМ 7."
        ВЫВОД: "ВЕСЬ ДРУГ ПРОЕКТА ВСЕМ ЕМУ ПРИХОДИТСЯ?"
    КНЦ;
  4. EJudge: TarFile 'Размер архива'

    Написать программу, которой на стандартный ввод подаётся tar-архив в виде шестнадцатеричного дампа (последовательность шестнадцатеричных цифр, возможно, разделённых пробелами и переводами строки), а на выходе она показывает количество и суммарный объём хранящихся в нём файлов, если их распаковать.

    Input:

    1f8b0800000000000003edd64d6ac3301005e059
    f714ba8134d2482abe42c92a2748529365c1690e
    9013147a9ff60cce8de23f085da4c18b51e3f2be
    8d0d3648f0347e664bea5c27c7385ed3cfeb8458
    42483e4a6621c72e4a2013f5b746743cbc6f1a63
    685fbf35fbfaf67bf79e2f14db57f535fa8093c8
    9cfc53ce649cface08f9db9dfa1a77f317bee6df
    9d8521ff84fc4b683fcf27e39d69bfdaeff34777
    e7bd715c8550856456eb97a7bfde20a892c7eaff
    10328ffd2fe8ff12c446f513302fffa1ff33e3ff
    af883effadf21a33fa7fcabffb0078f47f0937fa
    df7325cfe8ffff4fec467d8d79f33ff47f7698ff
    227e99ff88f90700000000000000000058ae0bcd
    cedba200280000
    Output:

    99 4

LecturesCMC/PythonIntro2022/11_Files (last edited 2022-11-26 22:48:23 by FrBrGeorge)