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

Оператор with

Далее см. contextlib.html

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

Всё это нужно не очень часто, есть либо NumPy, либо array

бНОПНЯ

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

Просто файлы

В tutorial

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

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

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

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

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

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

Но в чём же проблема просто взять и преобразовать объект в байты? В память слазить, наконец?

struct

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

dbm

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

Д/З

Внимание:

  1. ни input(), ни тем более eval(input()) в решениях данных задач использовать не получится, надо использовать файловые операции ввода-вывода.

  2. Поскольку idle (и, возможно, другие IDE) подменяет стандартный ввод-вывод для того, чтобы красиво работать с окошком, программу надо запускать ручками из командной строки примерно так:

    •   … python3 программа.py < тестовый_файл 

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

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

  2. EJudge: ZipInfo 'Размер архива'

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

    Input:

    504b03040a0000000000d6a07c5100000000000000000000000002001c00
    6f2f5554090003a483c25fab83c25f75780b000104f501000004f5010000
    504b03040a00000000000ea77c5100000000000000000000000004001c00
    6f2f312f55540900034c8fc25f568fc25f75780b000104f501000004f501
    0000504b03040a0000000000d8a07c510000000000000000000000000600
    1c006f2f312f352f5554090003a783c25fab83c25f75780b000104f50100
    0004f5010000504b03040a00000000000da77c5100000000000000000000
    000006001c006f2f312f322f5554090003498fc25f568fc25f75780b0001
    04f501000004f5010000504b03040a00000000000da77c514b8325172100
    0000210000000a001c006f2f312f322f646174655554090003498fc25f56
    8fc25f75780b000104f501000004f5010000d0a1d0b120d0bdd0bed18f20
    32382032303a35363a3235204d534b20323032300a504b03040a00000000
    0066a67c5100000000000000000000000008001c006f2f312f322f332f55
    54090003108ec25f3f8ec25f75780b000104f501000004f5010000504b03
    040a00000000000aa77c51ba7488890b0000000b0000000b001c006f2f31
    2f322f332f63616c5554090003438fc25f568fc25f75780b000104f50100
    0004f5010000323032302d31312d32380a504b03040a0000000000d6a07c
    510000000000000000000000000a001c006f2f312f322f332f342f555409
    0003a483c25fab83c25f75780b000104f501000004f5010000504b03040a
    00000000000ea77c5100000000000000000000000008001c006f2f312f6e
    6f6e6555540900034c8fc25f568fc25f75780b000104f501000004f50100
    00504b01021e030a0000000000d6a07c5100000000000000000000000002
    0018000000000000001000ed41000000006f2f5554050003a483c25f7578
    0b000104f501000004f5010000504b01021e030a00000000000ea77c5100
    0000000000000000000000040018000000000000001000ed413c0000006f
    2f312f55540500034c8fc25f75780b000104f501000004f5010000504b01
    021e030a0000000000d8a07c510000000000000000000000000600180000
    00000000001000ed417a0000006f2f312f352f5554050003a783c25f7578
    0b000104f501000004f5010000504b01021e030a00000000000da77c5100
    0000000000000000000000060018000000000000001000ed41ba0000006f
    2f312f322f5554050003498fc25f75780b000104f501000004f501000050
    4b01021e030a00000000000da77c514b83251721000000210000000a0018
    000000000001000000a481fa0000006f2f312f322f646174655554050003
    498fc25f75780b000104f501000004f5010000504b01021e030a00000000
    0066a67c51000000000000000000000000080018000000000000001000ed
    415f0100006f2f312f322f332f5554050003108ec25f75780b000104f501
    000004f5010000504b01021e030a00000000000aa77c51ba7488890b0000
    000b0000000b0018000000000001000000a481a10100006f2f312f322f33
    2f63616c5554050003438fc25f75780b000104f501000004f5010000504b
    01021e030a0000000000d6a07c510000000000000000000000000a001800
    0000000000001000ed41f10100006f2f312f322f332f342f5554050003a4
    83c25f75780b000104f501000004f5010000504b01021e030a0000000000
    0ea77c51000000000000000000000000080018000000000000000000a481
    350200006f2f312f6e6f6e6555540500034c8fc25f75780b000104f50100
    0004f5010000504b05060000000009000900b7020000770200000000
    Output:

    3 44
  3. EJudge: BnopnyAnna 'Неудачная перекодировка'

    Наши любимые Лев Николаевич и Анна Аркадьевна вновь пустились в приключения! На этот раз некто взял случайный фрагмент из 75 подряд идущих строк файла, и попытался их перекодировать. Но не точно из кодировки utf-8, а из случайной (набор разрешённых кодировок см. ниже). Кодировка, в которую происходило перекодирование, тоже была выбрана случайно из того же набора. Операция прошла успешно! Возможно, не один раз, а два или даже три (но не больше). Получилась редкостная бНОПНЯ. Вывести первую строку исходного фрагмента, в предположении, что обратная перекодировка также возможна.

    • Набор допустимых кодировок:
      • cp1026 cp1140 cp1256 cp273 cp437 cp500 cp775 cp850 cp852 cp855 cp857 cp860 cp861 cp862 cp863 cp865 cp866 gb18030 hp_roman8 iso8859_10 iso8859_11 iso8859_13 iso8859_14 iso8859_15 iso8859_16 iso8859_2 iso8859_4 iso8859_5 iso8859_9 koi8_r mac_cyrillic mac_greek mac_latin2 mac_roman utf_8
    • Ввод делать со стандартного ввода (не из файла)
    • Дополнение. Пока во временнЫе рамки укладывается только решение, в котором на любом этапе перекодировки участвуют только такие пары, которые одновременно пригодны и для исходного файла, т. е. для первого этапа. Поскольку совершенно не факт, что на втором этапе не появятся новые варианты, в этом году будем решать задачу с этим дополнительным допущением.

    Input:

    …содержимое файла…
    Output:

    она. - Не говорите, пожалуйста, со мной про оперу, вы ничего не понимаете  в
    • Это довольно сложная задача

LecturesCMC/PythonIntro2021/11_Files (last edited 2021-11-30 14:07:45 by FrBrGeorge)