Запись в файл в Python вставляет нулевые байты

Я пишу программу списка задач. Он сохраняет файл с тем, что нужно сделать в строке, и позволяет пользователю добавлять или удалять элементы. Проблема в том, что по какой-то причине я получаю много нулевых байтов в начале файла, даже если элемент правильно удален. Я покажу вам пару скриншотов, чтобы убедиться, что я ясно выражаюсь.

это файл в Notepad++ перед запуском программы:

нормальный список todo http://img683.imageshack.us/img683/2812/beforew.png

это файл после удаления пункта 3 (считая от 1):

элемент 3 исчез, но есть нулевые байты http://img190.imageshack.us/img190/9387/afterj.png

Это соответствующий код. Фактическая программа больше, но запуск только этой части вызывает ошибку.

import os
TODO_FILE = r"E:javicodePythontodo-listsrctodo.txt"

def del_elems(f, delete):
    """Takes an open file and either a number or a list of numbers, and deletes the
    lines corresponding to those numbers (counting from 1)."""
    if isinstance(delete, int):
        delete = [delete]
    lines = f.readlines()
    f.truncate(0)
    counter = 1
    for line in lines:
        if counter not in delete:
            f.write(line)
        counter += 1

f = open(TODO_FILE, "r+")
del_elems(f, 3)
f.close()

не могли бы вы указать, где ошибка?

3 ответов


мне кажется,что вы забыли перемотать поток файлов. После f.truncate(0) добавьте f.seek(0). В противном случае, я думаю, что ваша следующая запись попытается начать с позиции, с которой вы остановились, заполняя нулевые байты по пути туда.

(обратите внимание, что количество нулевых символов в вашем примере равно количеству символов в удаленных строках плюс символ возврата каретки и строки для каждого из них.)


С руководство Python:

file.truncate([size])
Усечь размер файла. Если параметр в размере аргумент присутствует, файл усекается до (не более) этого размера. Размер по умолчанию равен текущей позиции. текущая позиция файла не меняется. обратите внимание, что если указанный размер превышает текущий размер файла, результат зависит от платформы возможно также, что файл может оставаться неизменной, увеличиваться в указанный размер как бы заполняется нулем или увеличивается до указанного размера с неопределенным новым содержимым. Доступность: Windows, много вариантов Unix.

вы усекаете файл, а затем записываете item1 и item2 в первом конце файла. Все, что до этого заканчивается с 0 байтами.

f.seek(0)

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


намек. Не делай этого.

в старые времена (30 лет назад -- серьезно) мы" обновляли " файлы со сложной логикой добавления/изменения/удаления.

В настоящее время жизнь проще, если вы пишете программы, которые

  1. читать весь файл в память.

  2. работа над объектами в памяти.

  3. периодически записывайте объекты в файл и когда пользователь хочет спасать.

это быстрее и проще. Использовать pickle чтобы сбросить ваши объекты в файл. Не связывайтесь с " записями "или любой попыткой изменить файл"на месте".

Если вы действительно считаете, что вам нужны возможности SQL (Insert, Update, Delete), используйте SQLite. Это надежнее, чем то, что вы пытаетесь сделать.