Не понятен сам вопрос.
Что значит "описана работа лишь с файлами с последовательным доступом"?
"Про работу с файлами в полном объёме" - это ты про скачивание?
В книге приводится алгоритм, где для перезаписи какой-то информации в файле мы обращаемся к "файлу с последовательным доступом", в котором хранятся строковые значения, разделенный \n. Программа создает временный фаил, перебирает все значения в файле вывода от самого начала и записывает каждое значение во временный фаил. Когда находит определенное значение, которое мы хотим изменить, программа вместо этого значения записывает во временный фаил новое значение (измененное), а затем записывает последовательно все оставшееся. Далее фаил ввода удаляется, а временный фаил получает имя удаленного, и сам становится файлом ввода. Таким образом мы изменили какое-то значение в хранящемся файле.
Далее написано:
Во время работы с файлом с последовательным доступом приходится копировать весь файл всякий раз, когда удаляется одно значение из файла. Как уже упоминалось ранее, этот подход неэффективен, в особенности если файл является крупным. Существуют другие, более продвинутые методы, в частности для работы с файлами с прямым доступом, которые намного эффективнее. В настоящей книге эти методы не рассматриваются, но вы сможете познакомиться с ними самостоятельно.
В связи с этим просьба посоветовать источник, в котором рассматривается работа с файлами в полном объёме
Так вот под то, что тебе хочется, есть отдельные форматы файлов, которые могут по сути представлять из себя подобие баз данных. Например, hdf5, netCDF4, tif на худой конец...
В них есть возможность хранить массивы данных и дергать их по индексу или названию слоя или все вместе.
Но банальный текстовый файл такого тебе не позволит.
Рассмотри также json-файлы. Их придётся грузить в память полностью, а дальше по ключу дергать любой кусок.
Хороший источник это докумментация Python: https://docs.python.org/3/
Сейчас попробую вкратце объяснить в чём трудности и куда копать. На низком уровне операции с файлами можно представить совокупностью действий "записать что-то", "прочесть что-то" и поставить курсор. Если ты просто читаешь из файла до его конца или просто пишешь в файл пока данные не кончатся, то курсор автоматически перемещается обходя файл из начала в конец в первом случае и всегда стоит на его конце во втором.
Конкретно с текстовыми файлами (строки кончающиеся символами \n) эффективно решить задачу об удалении строки не выйдет. Лучшее что ты можешь сделать это пропустить с помощью "поставить курсор" (seek) ту часть, что не изменилась, но вся часть файла что идёт начиная с удаленной строки должна измениться, все символы за этой строкой сдвинутся влево на длину этой строки.
Мы можем ещё улучшить эту ситуацию, если бы например мы бы договорились что символы с нулевым кодом мы просто игнорируем. Тогда удаленную строку мы можем заменить нулевыми символами. Мы стали эффективнее писать, но теперь нам стало уже не так эффективно читать, ведь при чтении мы эти нулевые символы должны фильтровать.
Дела обстоят гораздо лучше когда мы работаем в двоичном файле. Но как тут уже говорили самому что-то изобрести довольно трудно и можно попробовать скопировать что-то уже известное, например попробовать сделать подобие файловой системы на B-деревьях, за инфой можно даже к википедии сходить, там описано как с помощью этих деревьев можно строить файловую систему без наворотов. Поскольку такие деревья можно плюс-минус хранить в массиве, то и в файле (который очень похож на абстракцию массива) тоже хранить их замечательно.
Можно взять вариант попроще - например, попробовать сделать для себя пример с хранением чисел в двоичном виде в файле с возможностью быстро выбирать максимальное/минимальное, с достаточно быстрой вставкой новых чисел (log n) и удалением (log n). Одним словом можно попробовать сделать структуру данных куча (heap) на файле. Это даст некоторый навык в низкоуровневых двоичных операциях произвольного доступа к файлу.
Ну а если нужно именно применять на практике, прочтите другие комменты, где советуют библиотеки и форматы файлов решающие именно такую задачу.
возможно в книге имелся в виду не доступ к файлам как-то по иному, а например модуль shutil который дает копировать файлы и изменять их параметры.
кстати по поводу чтения файлов советую почитать https://habr.com/ru/post/453862/
у pathlib есть вариант чтения файлов по glob-у, то есть не надо делать извраты чтобы найти все файлы одного расширения
https://stackoverflow.com/questions/48181073/how-to-glob-two...
А остальные с высочайшей степенью вероятности не встретятся вам в обычной практике, особенно при разработке на питоне. За те 25 лет, которые я так или иначе занимался программированием, лично мне ни разу не встретилась задача такого рода, под которую не существовало бы уже готового решения.
Это, скажем так, вопрос принципиально другого уровня и он напрямую не связан с языком. Вам надо смотреть, как такой доступ в принципе реализуется в конкретной файловой системе средствами конкретной ОС (собственно, про API, комментарий уже был)
https://pythonworld.ru/tipy-dannyx-v-python/fajly-rabota-s-f...
Или официальую доку. Или гуглишь по "file python"
Самый ценный совет - учись решать проблемы самостоятельно. Это не тот вопрос, для которого нужен консилиум
Кстати забыл главное.
1. По задаче проще понять суть.
Создай свою файловую индексную ФС примитивного уровня. Есть файл, в нём есть имена файлов или сущностей, и контент. Причём чтобы был индекс.
Для тестов даже ходить далеко не надо.
2. Посмотри как это сделано. Есть куча форматов принятых, например pak из quake https://sources.ru/magazine/0906/02.html - всё то же с многоуровневыми только в виде сущности каталогов.
А то что у тебя будет условно более старый формат а-ля WAD из первого дума. https://doomwiki.org/wiki/WAD
Суть - к питону это не привязано. На RAW уровне все его функции для работы с файлами дублируют принятые и по факту переходники на функции либов или ядра OS(ну хотя бы они +- одинаковы от ОС к ОС)
И тут сразу две ветки
1. Обучение - тебе надо понять каким методом используется адресация и хранение каких-либо записей(обычно struct) в файлах. Доступ и прочее - там аналогично и похоже на malloc/free в C/C++ притяном stdlib например. Индекс имязаписи=адрес(ясное дело мы про динамику)+сама запись где-то по адресу x в файле итд, лучше прямо туда и пойти и понять как работать с указателями в C++, там вокруг этого пол языка и идеология пляшет собственно, а на сам язык насрать.
2. Практика. НАСРАТЬ НА ТЕМУ, ВООБЩЕ. Ты будешь работать с API(классом, интерфейсом, да насрать чем, суть понятна) либа для работы с соответствующим типом данных в файлах, на всё выше в 99% класть вообще, будет оно читать файл в память полностью или играть или строить индекс - уже где как. Например
https://habr.com/ru/post/481140/
Нет никаких списков, есть описанный формат хранения, адресация определяется им, если у полей фиксированные длины - положение каждой записи считается легко, если нет - фулл скан или индекс.
Об этом бесполезно читать потому что оно в каждом кейсе свое.
В том же принятом для разработки почти в любом курсе есть статика для начала - типа fwrite(f, somestruct, size of(somestruct)) итд например и оттуда пляски в *работе с файлами нетипизированными*
В паскале тот же костыль вида file of xxx есть и прочее, прочее....
Освой базисы апи системы. Все пляшет вокруг одного, вставить файл или запись в середину файла невозможно без костылей, и далее уже индексы для чтения и костыли для такого при правке записей со сменой длины в середине
Индекс или чтение файла и индекс на лету каждый раз по тем же \n, ничего принципиально разного тут нету
Есть список 100 людей. ID, имя, фамилия, телефон. Мне надо изменить телефон у человека с id #73. Я понимаю как это сделать в SQL, там удобно, но в книге по пайтон показан громоздкий способ, где перебирается весь фаил., но при этом намекают, что надо где-то в другом месте прочитать про более удобный способы. Вы не знаете где? )




Программирование на python
1K поста12K подписчика
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• конструктивность комментариев
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу