Как удалить байты из файла python
Удаление элементов с файла
Как можно удалить элементы с файла(Например четные) на обычном Си.
Удаление элементов файла
Дан символьный файл, содержащий по крайней мере 1 символ пробела. Удалить все его элементы.
Удаление элементов из файла
Помогите пожалуста! Файл генерируетса из случайних целых чисел нада удалить из файла все.
Удаление элементов из файла
Помогите пожалуста! Файл генерируетса из случайных целых чисел нужно удалить из файла все одно.
нужно удалить первые n элементов в файле .txt, не перегоняя его в память (без конвертации в str и тд).
Можно читать файл построчно и сразу записывать строку в другой файл. То есть вы в каждый момент времени в памяти будете держать не весь файл, а только одну строку.
чего т в последнее время то просят преобразовать все элементы коллекции не пробегая по ней, то файл менять не трогая его. Квантовые компы на подходе?
просто я ищу максимально эффективное решение для чисел пи огромного размера. Думаю, идеальным решением будет просто деление большого файла
Добавлено через 55 секунд
alilxxey, ааа, так нафиг его делить, читай его кусками, тебе же надо найти совпадающую последовательность?
Ну смотрите, условно, искомая последовательность находится на 10 10 знаке пи после запятой. Если читать его последовательно, то памяти хана. Поэтому я делаю так.
ИДЕЯ ЗАРЕЗЕРВИРОВАНА. D
с чего бы это? читаешь то ты не весь файл а кусками по мегабайту например. То есть памяти всегда будет ровно мегабайт занято.
Добавлено через 1 минуту
вернее не "читаешь", а должен читать! в питоне все средства для этого есть
Welemir1, да я уже в прошлой теме пытался ему донести мысль про очередь: читаем порцию очередную порцию данных и ищем нужную подпоследовательность с префиксом из 8 элементов от предыдущей порции (данных).
alilxxey, надеешься конкурс выиграть?
Всегда завидовал такому оптимизму.
я лично за него болею! ему б оперативки побольше.
выиграть не надеюсь, но очень понравилась сама идея задачи, да и у меня как раз было 0 знаний в работе с файлами, так что я еще и учусь в плюс ко всему. Авось за "оригинальность" решение призовое место займу, но это так, мечты)
:D Спасибо! с оперативкой все в порядке, хватает))
Добавлено через 2 минуты
с чего бы это? читаешь то ты не весь файл а кусками по мегабайту например. То есть памяти всегда будет ровно мегабайт занято.
Добавлено через 1 минуту
вернее не "читаешь", а должен читать! в питоне все средства для этого есть
не особо понимаю. для того, чтобы считать условно [25:50] символы, мы должны считать f.read(50), а уже после этого выкинуть первые 25. Нет?
я даже ред создал на эту тему, искал способ, как убирать первые n элементов файла, чтобы каждый раз со спокойной душой писать f.read(1000) и тд
Решение
alilxxey, а если прямо полезть в доку и почитать? типа там про seek и прочие приблуды написанные добрым дедушкой Гвидо специально для нас, неблагодарных?
Добавлено через 2 минуты
но авто-разрезку файлов я уже начал, так что придется закончить)
Удаление элементов типизированного файла.
Помогите кто-нибудь написать программу,а то очень срочно,если не сложно Создать типизированный.
Удаление повторяющихся элементов из файла
Доброго. Имеется файл, в котором записаны строки (это числа, которые поместятся в 4 байта). В.
Удаление элементов из txt файла
Здравствуйте! Подскажите пожалуйста, как при открытии txt файла с данными: " ./1_2_3_ ./2_2_3_.
Удаление выбранных элементов в ListBox из файла
Добрый день. Помогите, пожалуйста, разобраться. У нас имеется listBox, в который мы можем добавлять.
Удаление всех элементов файла после максимального
Добрый день, возникли проблемы с написанием программы для удаления всех элементов файла после.
У меня есть папка, полная файлов, которые нужно изменить, чтобы извлечь настоящий файл в его реальном формате.
Мне нужно удалить определенное количество байтов как из начала, так и из конца файла, чтобы извлечь данные, которые я ищу.
Как я могу сделать это в Python?
- Мне нужно, чтобы это работало рекурсивно только для всей папки
- Мне также нужно это для вывода (или изменения существующего) файла с удаленными байтами.
Буду очень признателен за любую помощь или руководство, которое вы можете предоставить.
2 ответа
- Рекурсивный перебор файлов os.walk
- Изменить позицию в файле: f.seek
- Получить размер файла: os.stat
- Удалить данные с текущей позиции до конца файла: f.truncate
Итак, базовая логика:
- Перебирать файлы
- Получите размер файла.
- Открыть файл (полагаю, 'rb +')
- Найдите позицию, из которой вы хотите прочитать файл
- Читайте до тех пор, пока не будут удалены байты (f.read (file_size - top_dropped - bottom_dropped))
- Искать (0)
- Записать прочитанный текст в файл
- Усеченный файл
Ваш вопрос довольно плохо составлен, но, поскольку это несколько сложный материал, я предоставлю вам код.
Теперь вы можете использовать os.walk () для рекурсивного обхода нужного каталога и применить мою функцию slicefile ().
Этот код делает следующее:
После проверки правильности аргументов начала и конца он создает карту памяти поверх открытого файла. mmap () создает объект карты памяти, который отображает, в данном случае, часть файловой системы, в которой записывается файл. Объект предоставляет как строковый, так и файловый интерфейс с некоторыми дополнительными методами, такими как move (). Таким образом, вы можете рассматривать карту памяти либо как строку, либо как файл, либо использовать size (), move (), resize () или любые другие дополнительные методы, которые вам нужны.
Мы вычисляем, какое расстояние между нашим началом и концом, то есть сколько байтов у нас будет в итоге.
Мы перемещаем поток байтов, длинный конец-начало, начиная с нашей начальной позиции в позицию 0, т.е. мы перемещаем их назад на количество байтов, указанное начальной точкой.
Выбрасываем оставшуюся часть файла. Т.е. мы изменяем его размер до конечных начальных байтов. Итак, что осталось, это наша новая строка.
Чем больше файл, тем дольше операция. К сожалению, с этим ничего не поделаешь. Если файл большой, это лучший вариант. Процедура такая же, как и при удалении элементов из начала / середины массива в памяти, за исключением того, что они должны буферизоваться (по частям), чтобы не заполнять ОЗУ слишком много.
Если ваш файл меньше трети свободного места в ОЗУ, вы можете загрузить его целиком в строку с помощью f.read (), затем выполнить нарезку строки для загруженного содержимого (s = s [start: end]), а затем написать его обратно в файл, открыв его снова и просто выполнив f.write (s). Если у вас достаточно места на диске, вы можете открыть другой файл, найти нужную начальную точку в исходном файле, а затем прочитать ее по частям и записать их в новый файл. Возможно, даже используя shutil.copyfileobj (). После этого вы удаляете исходный файл и с помощью os.rename () помещаете новый на его место. Это ваши единственные 3 варианта. Целый файл в ОЗУ; двигаться, буферизуя назад, а затем изменяя размер; и, копируя в другой файл, затем переименовывая его. Второй вариант наиболее универсален и не подведет как для маленьких, так и для больших файлов. Поэтому я его и использовал.
Хорошо, не только 3 варианта. Есть четвертый вариант. Можно было бы отрезать N байтов от начала файла, манипулируя самой файловой системой с помощью операций низкого уровня. Чтобы написать что-то вроде функции truncate (), которая обрезает начало вместо конца. Но это было бы самоубийством. В конце концов произойдет фрагментация памяти и возникнет полный беспорядок. В любом случае такая скорость не нужна. Вы будете терпеливы, пока ваш сценарий не закончится. : D
Почему я использовал mmap ()?
Потому что он использует карты памяти, реализованные в ОС, а не полностью новый код. Это уменьшает количество системных вызовов, необходимых для работы с открытым файлом. Половина работы возлагается на операционную систему, поэтому Python может легко дышать.
Потому что он в основном написан на C, что делает его чуть быстрее, чем его реализация на чистом Python.
Потому что он реализует move (), который нам нужен. Буферизация и все уже написано, поэтому нет необходимости в громоздком цикле while, который был бы альтернативным (ручным) решением.
У меня есть папка, полная файлов, которые необходимо изменить, чтобы извлечь настоящий файл в реальном формате.
Мне нужно удалить определенное количество байтов из BOTH начало и конец файла, чтобы извлечь данные, которые я ищу.
Как я могу сделать это в python?
-
Мне нужно, чтобы это работало рекурсивно только для всей папки Мне также нужно это для вывода (или изменения существующего) файла с удаленными байтами.
Я был бы очень признателен за любую помощь или рекомендации, которые вы можете предоставить.
Рекурсивная итерация по файлам os.walk Изменить позицию в файле: f.seek Получите размер файла: os.stat Удалить данные с текущей позиции до конца файла: f.truncate
Итак, базовая логика:
Итерировать файлы Получите размер файла. Открыть файл ('rb+' я suppouse) Ищите позицию, из которой вы хотите прочитать файл Прочитайте до тех пор, пока вы не удалите байты (f.read(file_size - top_dropped - bottom_dropped)) Seek (0) Запись прочитанного текста в файл Файл усечения
Ваш вопрос довольно плохо сконструирован, но поскольку это несколько продвинутый материал, я предоставил вам код.
Теперь вы можете использовать os.walk() для рекурсивного прохождения желаемого каталога и применения моей функции slicefile().
Этот код выполняет следующие действия:
После проверки правильности начальных и конечных аргументов он создает карту памяти поверх открытого файла. mmap() создает объект карты памяти, который отображает в данном случае часть файловой системы, над которой написан файл. Объект предоставляет как текстовый, так и файловый интерфейс с некоторыми дополнительными методами, такими как move(). Таким образом, вы можете обрабатывать карту памяти либо в виде строки, либо в виде файла, либо использовать size(), move(), resize() или любые дополнительные методы, которые вам нужны.
Мы вычисляем расстояние между нашим началом и концом, т.е. Это количество байтов, которое мы будем иметь в конце.
Мы перемещаем поток байтов, начиная с начала, начиная с нашей начальной позиции до позиции 0, т.е. Мы перемещаем их назад для количества байт, обозначенных начальной точкой.
Мы отбрасываем остальную часть файла. Т.е. мы изменяем его размер до конечных байтов. Итак, осталась наша новая строка.
Операция будет больше, поскольку файл больше. К сожалению, вы ничего не можете с этим поделать. Если файл большой, это ваш лучший выбор. Процедура такая же, как при удалении элементов из начала/середины массива в памяти, за исключением того, что это должно быть буферизировано (в кусках), чтобы не слишком много заполнять ОЗУ.
Если ваш файл меньше трети вашего свободного пространства в оперативной памяти, вы можете загрузить его целиком в строку с помощью f.read(), затем выполнить нарезку строки на загруженном содержимом (s = s [начало: конец]), а затем написать он возвращается в файл, открывая его снова и просто выполняя f.write(s). Если у вас достаточно места на диске, вы можете открыть другой файл, найти исходную точку, которую вы хотите в исходном файле, а затем прочитать ее в кусках и записать в новый файл. Возможно, даже используя shutil.copyfileobj(). После этого вы удаляете исходный файл и используете os.rename() для размещения нового на своем месте. Это ваши 3 варианта. Весь файл в оперативную память; перемещаться путем буферизации назад и затем изменения размера; и, копируя в другой файл, а затем переименовывая его. Второй вариант является самым универсальным и не подведет вас для небольших или больших файлов. Поэтому я использовал его.
ОК, Не только 3 варианта. Существует четвертый вариант. Можно было бы отключить N количество байтов от начала файла, манипулируя самой файловой системой, используя операции низкого уровня. Чтобы написать функцию truncate(), которая усекает начало, а не конец. Но это было бы очень суицидально. В конце произойдет фрагментация памяти и возникнет весь беспорядок. В любом случае, вам не нужна такая скорость. Вы будете терпеливы, пока ваш сценарий не закончится. : D
Почему я использовал mmap()?
Потому что он использует карты памяти, реализованные в ОС, а не полностью новый код. Это уменьшает количество системных вызовов, необходимых для работы с открытым файлом. Половина работы направлена на операционную систему, оставляя Python легко дышать.
Поскольку он в основном написан на C, который делает его более быстрым, чем его чистая реализация на Python.
Потому что он реализует move(), который нам нужен. Буферизация и все уже написано, поэтому нет необходимости в громоздких циклах, которые были бы альтернативным (ручным) решением.
Байтовые строки bytes и объекты bytearray поддерживают общие операции с последовательностями. Они взаимодействуют не только с операндами одного типа, но и с любыми байтовыми объектами, которые поддерживают буферный протокол и могут экспортировать непрерывный C -буфер, например memoryview . Благодаря такой гибкости они могут свободно смешиваться в операциях, не вызывая ошибок. Однако тип возвращаемого результата может зависеть от порядка операндов.
Важно: Методы в байтовых строках bytes и bytearray объектах не принимают текстовые строки в качестве своих аргументов, так же как методы текстовых строк не принимают байты в качестве своих аргументов. Например, вы должны написать:
Некоторые операции c bytes и bytearray предполагают использование ASCII-совместимых двоичных форматов, и, следовательно, их следует избегать при работе с произвольными двоичными данными.
Важно: Использование операций на основе ASCII для управления двоичными данными, которые не хранятся в формате на основе ASCII, может привести к повреждению данных.
Представленные ниже методы для байтовых строк bytes и bytearray объектов могут использоваться с произвольными двоичными данными:
Метод count() типов bytes и bytearray в Python
Метод `count()` возвращает число неперекрывающихся вхождений подпоследовательности `sub` в диапазоне `[start, end]`. Необязательные аргументы `start` и `end` интерпретируются как в нотации среза.
Метод decode() типов bytes и bytearray в Python
Метод decode() возвращает строку, декодированную из заданных байтов. Кодировка encoding по умолчанию - 'utf-8'. Обработчик ошибок errors может быть задан для другой схемы обработки ошибок.
Метод endswith() типов bytes и bytearray в Python
Метод `endswith()` возвращает `True`, если двоичные данные заканчиваются указанным суффиксом `suffix`, в противном случае возвращает `False`.
Метод find() типов bytes и bytearray в Python
Метод `find()` возвращает индекс первого совпадения байтовой подпоследовательности `sub`, такой, что `sub` содержится в срезе `s[start: end]`.
Метод index() типов bytes и bytearray в Python
Метод типов bytes и bytearray `index()` работает так же как и метод `find()`, за исключением того, что если байтовая подстрока не найдена, поднимается исключение `ValueError`.
Метод join() типов bytes и bytearray в Python
Метод `join()` возвращает новый `bytes` или `bytearray` объект, который является конкатенацией последовательности бинарных данных в объекте, поддерживающим итерацию `iterable`.
Метод maketrans() типов bytes и bytearray в Python
Статический метод `maketrans()` создает таблицу преобразования символов для метода `bytes.translate()`, который будет отображать каждый символ в `from` в символ в той же позиции в `to`.
Метод translate() типов bytes и bytearray в Python
Метод translate() возвращает копию объекта bytes или bytearray, где все байты, встречающиеся в необязательном аргументе delete, удаляются, а оставшиеся байты были сопоставлены через заданную таблицу преобразования table, которая должна быть
Метод partition() типов bytes и bytearray в Python
Метод `partition()` делит последовательность при первом появлении `sep` и вернет кортеж из трех значений, которые содержат часть перед разделителем, сам разделитель или его копию в виде `bytearray` и часть после разделителя.
Метод removesuffix() типов bytes и bytearray в Python.
Если исходная байтовая строка начинаются с байтовой строки suffix, то метод bytes.removesuffix() возвращает байтовую строку без суффикса bytes[len(suffix):]. В противном случае метод вернет копию исходных двоичных данных bytes.
Метод removeprefix() типов bytes и bytearray в Python.
Если исходная байтовая строка начинаются с байтовой строки prefix, то метод bytes.removeprefix() возвращает байтовую строку без префикса bytes[len(prefix):]. В противном случае метод вернет копию исходных двоичных данных bytes.
Метод replace() типов bytes и bytearray в Python
Метод `replace()` вернет копию байтовой последовательности, в которой все вхождения подпоследовательности `old` заменены на новые `new`. Если указан необязательный аргумент `count`, заменяются только первые `count` вхождения.
Метод rfind() типов bytes и bytearray в Python
Метод `rfind()` возвращает самый высокий индекс в байтовой строке `bytes` или `bytearray`, в которой находится подпоследовательность байтов `sub`, такой, что `sub` содержится в пределах s[start: end].
Метод rindex() типов bytes и bytearray в Python
Метод `rindex()` работает и возвращает то же самое что и метод `rfind()`, за исключением того, что при неудачном поиске поднимает исключение `ValueError`.
Метод rpartition() типов bytes и bytearray в Python
Метод `rpartition()` делит последовательность **при последнем вхождении `sep`** и вернет кортеж из трех значений, которые содержат часть перед разделителем, сам разделитель или его копию в виде `bytearray` и часть после разделителя.
Метод startswith() типов bytes и bytearray в Python
Метод `startswith()` возвращает `True`, если двоичные данные начинаются указанным префиксом `prefix`, в противном случае возвращает `False`.
Метод center() типов bytes и bytearray в Python
Метод `center()` возвращает копию строки соответствующего типа, размещенную по центру указанной длины `width`. Заполнение выполняется с использованием указанного байта заполнения `fillbyte`, по умолчанию используется пространство ASCII.
Метод ljust() типов bytes и bytearray в Python
Метод `ljust()` возвращает копию строки соответствующего типа, выравненную по левому краю указанной длины `width`. Заполнение выполняется с использованием указанного байта заполнения `fillbyte`, по умолчанию используется пространство ASCII.
Метод rjust() типов bytes и bytearray в Python
Метод `rjust()` возвращает копию строки соответствующего типа, выравненную по правому краю указанной длины `width`. Заполнение выполняется с использованием указанного байта заполнения `fillbyte`, по умолчанию используется пространство ASCII.
Метод lstrip() типов bytes и bytearray в Python
Метод `lstrip()` возвращает копию байтовой строки с удаленными заданными ведущими байтами. Аргумент `chars` представляет собой двоичную последовательность, задающую набор байтовых значений, которые должны быть удалены.
Метод rstrip() типов bytes и bytearray в Python
Метод `rstrip()` возвращает копию байтовой строки соответствующего типа с удаленными заданными `chars` конечными байтами. Аргумент `chars` представляет собой двоичную последовательность, задающую набор байтовых значений, которые должны быть удалены.
Метод strip() типов bytes и bytearray в Python
Метод `strip()` возвращает копию байтовой строки соответствующего типа с удаленными начальными и конечными байтами. Аргумент `chars` представляет собой двоичную последовательность, задающую набор байтовых значений, которые должны быть удалены.
Метод split() типов bytes и bytearray в Python
Метод `split()` делит байтовую строку на список строк того же типа, используя `sep` в качестве разделителя байтовой строки. Аргументом `sep` может быть любой байт-подобный объект.
Метод rsplit() типов bytes и bytearray в Python
Метод `rsplit()` делит байтовую строку на список подстрок того же типа, используя `sep` в качестве байтового разделителя. За исключением того, что начинает деление байтовой строки справа, метод rsplit() ведет себя как метод `split()`
Метод capitalize() типов bytes и bytearray в Python
Метод `capitalize()` возвращает копию байтовой строки, каждый байт которой интерпретируется как символ ASCII, причем первый байт будет заглавный, а остальные строчные. Байтовые значения, отличные от ASCII, передаются без изменений.
Метод expandtabs() типов bytes и bytearray в Python
Метод `expandtabs()` возвращает копию байтовой строки, в которой все символы табуляции ASCII заменяются одним или несколькими пробелами ASCII, в зависимости от текущего столбца и заданного размера вкладки.
Метод isalnum() типов bytes и bytearray в Python
Метод `isalnum()` вернет `True` если все байты в байтовой строке являются алфавитными символами ASCII или десятичными цифрами ASCII и байтовая строка не пуста, противном случае `False`.
Метод isalpha() типов bytes и bytearray в Python
Метод `isalpha()` вернет `True` если все байты в последовательности являются буквенными символами ASCII и байтовая строка не пуста, противном случае `False`.
Метод isdigit() типов bytes и bytearray в Python
Метод `isdigit()` вернет `True` если все байты в байтовой строке являются только десятичными цифрами ASCII и байтовая строка не пуста, в противном случае вернет `False`.
Метод isascii() типов bytes и bytearray в Python
Метод isascii() вернет True, если байтовая строка пуста или все байты в последовательности ASCII, в противном случае вернет False.
Метод islower() типов bytes и bytearray в Python
Метод `islower()` возвращает `True`, если в байтовой строке есть хотя бы один строчный символ ASCII и нет прописных символов ASCII, в противном случае вернет False.
Метод isspace() типов bytes и bytearray в Python
Метод `isspace()` возвращает `True`, если все байты в байтовой строке являются пробельными символами ASCII и последовательность не пуста, в противном случае вернет False.
Метод istitle() типов bytes и bytearray в Python
Метод `istitle()` вернет `True`, если последовательности символов ASCII в байтовой строке начинаются с символов в верхнем регистре и байтовая строка не пуста, в противном случае метод вернет `False`.
Метод isupper() типов bytes и bytearray в Python
Метод `isupper()` вернет `True` если в байтовой строке есть хотя бы один алфавитный символ в верхнем регистре ASCII и нет символов ASCII в нижнем регистре, в противном случае вернет False.
Метод lower() типов bytes и bytearray в Python
Метод `lower()` вернет копию байтовой строки, в которой все символы ASCII в верхнем регистре преобразованы в соответствующие им строчные буквы (нижний регистр).
Метод splitlines() типов bytes и bytearray в Python
Метод `splitlines()` возвращает список байтовых строк строк из двоичной последовательности. Деление происходит по управляющим символам перевода строки ASCII, при этом учитываются все возможные символы разрыва строки.
Метод swapcase() типов bytes и bytearray в Python
Метод `swapcase()` вернет копию байтовой строки со всеми символами ASCII в нижнем регистре, преобразованными в соответствующие им символы в верхний регистр, и наоборот.
Метод title() типов bytes и bytearray в Python
Метод `title()` возвращает копию байтовой строки, в которой все слова начинаются с символа ASCII в верхнем регистре, а остальные символы с нижнего регистра.
Метод upper() типов bytes и bytearray в Python
Метод `upper()` вернет копию байтовой строки, в которой все символы ASCII в нижнем регистре преобразованы в соответствующие им прописные буквы (верхний регистр).
Метод zfill() типов bytes и bytearray в Python
Метод `zfill()` вернет копию байтовой строки и заполнит цифрами ASCII `b'0'` пространство `width - len(s)`, для создания последовательности символов заданной ширины `width`.
Функция printf байтовых строк в Python
Байтовые объекты `bytes/bytearray` имеют одну уникальную встроенную операцию: оператор `'%'`, оператор называется по модулю. Это оператор также известен как оператор форматирования байтов или интерполяции.
Здравствуйте!
Подскажите пожалуйста как удалить из файла строку, без чтения и дальнейшей перезаписи. Файл большой и гонять его в оперативку не круто. Допустим известны номера символов начала и конца этой строки и как тогда из удалить напрямую? Может есть какой-нибудь метод для работы с объектом файла или какой-нибудь другой способ?
Прямое редактирование матрицы (типизированного файла)
Имеется матрица бинарного отношения. Как возможно организовать прямое редактирование её значений.
Удаление строки из файла\либо удаление самого файла.
День добрый, вот функция(используемые переменные объявленны ранее): void delete_cruise() < FILE.
Класс, содержащий функции для работы с текстовым файлом (создание файла, удаление файла)
я понимаю ;-) что нужно руками гуглить , время поджимает. подскажите как Создать класс, содержащий.
Удаление совпадающих слов одного файла из другого файла
Существует следующая проблема. Есть 2 текстовых файла. В первом файле находится текст, а во втором.
Можно не загружать весь файл в память, а работать с ним по строчно на пример (используя итераторы).
Добавлено через 2 минуты
Если использовать python 3, то следующий пример будет загружать в память только 1 строку:
Ну я построчно с ним и работаю. Дело не в этом. Можно конечно построчно читать файл и заносить нужные строки в новый файл, а потом удалить старый, но это будет очень не эффективно и много времени займет. мне нужно как раз без этого.
Например удалить последнюю строку. в этом случае просто нужно сократить размер файла на n символов. вот есть ли что-нибудь типа file.read(номер символа), только чтобы не считывал, а удалял
По умолчанию метод read() читает данные последовательно по порядку, от начала и до конца файла. Для произвольного доступа к файлу есть функция seek:
seek(offset[, whence])
offset – смещение в байтах относительно начала файла;
whence – по умолчанию равен нулю, указывает на то, что смещение берется относительно начала файла.
как попасть на нужную позицию я знаю и что это за позиция тоже. как ужалить-то символ на этом месте?
допустим
>>> f = open(r'my_file', 'w')
>>> f.write('0123456789')
>>> f.seek(5)
как мне его удалить. что бы строка стала 012346789
Ну это детали, вы просили показать способ, способ я вам показал, а как вы его применять будете, это уже другой вопрос.
Я конкретно такую задачу не решал, так что ничего больше пока сходу сказать не могу.
если без перезаписи, то я бы смотрел в сторону оперирования секторами диска.
в теории нам нужно знать в какие конкретно сектора записана наша строка, удалить информацию из них и поместить указатель на продолжения файла. Как реализовать не представляю тем более средствами питона + возможно последствие - сильная фрагментация данных на диске.
зато не нужно писать файл в оперативку,
ТС, а что у вас за файл такой большой из которого нужно удалять строки? Я бы на вашем месте данные запихнул в базу данных, так проще оперировать с ними да и удобнее.
Как я сразу заметил, используя генераторы и так весь файл не будет записываться в ОЗУ. Если покумекать, то при помощи метода seek и генераторов, можно написать, примерно, то что хочет автор вопроса. Мысли в принципе есть, но пробовать некогда.
Если человек задаёт такие вопросы на форуме, то он скорее ФС запорет, чем это сделает.
Ваше предложение можно сравнить с идеей сделать самому подводную лодку. Во 1 идея довольно рисковая, во 2 вероятность осуществления очень низка и в 3 как говорится "Овчинка выделки не стоит".
Всем спасибо за помощь. На данный момент сделал несколько криво, но действенно. Основной файл не трогаю, но при этом создается вспомогательный файл где, хранятся номера первых и последних символов удаляемых строк и таким образом при чтении основного файла эти строки игнорируются, а ночью сразу после ресстарта файл переписывается уже без этих строк.
Насчет использования базы данных идея конечно хорошая, но для этого все пришлось бы переделывать(так было еще до меня) + строки совершенно не систематезированны и имеют произвольных контент, и поэтому использование БД проблематично
На данный момент оставляю все как есть. Если будут проблемы, то будем решать их по мере появления)
Читайте также: