Как удалить определенное количество байтов в файле python - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть файл file.txt, который содержит текст 12345 (всего 5 байт). Я хочу удалить 3 и сдвинуть 45 на один байт влево, и в общей сложности я хочу получить 1245 (всего 4 байта).

Вот мой код:

with open ('a.txt', "r+b") as fl:
    fl.seek(0)
    onetwo = fl.read(2)
    fl.seek(3)
    fourfive = fl.read(2)
    fl.seek(0)
    fl.write(onetwo+fourfive)

Но в результате я получаю следующее: 12455

Я пытался усечь, но усечение не помогает решить файл, над которым я работаю (не этот файл).

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Используйте метод truncate для сжатия файла после смещения байтов.

# Create the original file
with open('foo', 'wb') as f:
    f.write(b'12345')

# Shift the last two bytes, then truncate.
with open('foo', 'r+b') as f:
    f.seek(3)
    d = f.read()   # d == b'45'
    f.seek(2)
    f.write(d)  # overwrites the original 3 and 4 => b'12455'
    f.truncate()  # Shrink to the current position => b'1245'

На практике вы, вероятно, не будете использовать жестко закодированные смещения, но это демонстрирует идею .

0 голосов
/ 28 апреля 2020

Вам нужно переписать файл, что нельзя сделать так, как вы пытались. Я попробовал это, и это сработало:

with open ('a.txt', "r") as fl:
    fl.seek(0)
    onetwo = fl.read(2)
    fl.seek(3)
    fourfive = fl.read(2)

with open('a.txt','w') as fl:
    fl.write(onetwo+fourfive)
0 голосов
/ 28 апреля 2020

Вы должны написать новый файл:

with open ('a.txt', 'r') as f1, open ('b.txt', 'w') as f2:
  # read and write operations...

Затем переместить файлы для перезаписи:

import os
os.rename('b.txt', 'a.txt') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...