Перезапись части файла приводит к пустой строке Python 3


EDIT: решение было просто изменить, как я открывал файл (спасибо Primusa), а не как я заменял информацию.

Я пытаюсь перезаписать части файла, но мой код не работает. Когда он запускается, он полностью стирает все в файле, не оставляя ничего позади.

Вот мой код:

for fname in store:
    with open(fname + ".txt", "w+") as f:
        for line in f:
            c = store[fname]
            x = (c-1)%len(line.split(","))
            y = m.floor((c-1)/len(line.split(",")))

            for n in range(y):
                f.readline()

            ldata = line.strip("n").split(",")
            for i in range(len(ldata)):
                ldata[i] = int(ldata[i])

            if w == None:
                ldata[x] += 1
            elif w == True:
                ldata[x] += 2
            elif w == False:
                ldata[x] -= 1

            #s = line.find("n") - 1
            #f.truncate(s)
            f.write(str(ldata) + "n")

Ключ:

  • fname: строковая переменная, соответствующая имени файла без типа файла.
  • store: a словарь, содержащий ключи имен файлов в виде строк и целых чисел.
  • f: файл, содержащий несколько строк целочисленных списков.
  • c: целочисленная переменная, используемая для определения целого числа, к которому необходимо получить доступ.
  • x и y: переменные со значениями, заданными в виде столбца и строки (соответственно) целого числа, доступ к которому осуществляется в файле.
  • w: переменная, хранящаяся либо как логическое значение, либо как None, используемая для определения того, должно ли полученное целое число увеличиваться или уменьшиться, и на сколько.
  • s: неиспользуемая в данный момент целочисленная переменная, используемая для усечения части файла.

Пример использования:

Предположим, у меня есть файл Foo.txt, в котором хранится следующая информация:

0,2,3,7

11,3,6,4

Я хочу увеличить значение "6" на 2, поэтому я запускаю код с w, установленным в True, и добавляю "Foo" : 7 к store, так как "6" - это 7-е число в файле (независимо от списка длина).

Что должно произойти:

Foo.txt модифицирован и теперь содержит:

0,2,3,7

11,3,8,4

Что на самом деле происходит:

Foo.txt все еще существует, но теперь содержит:

То есть она пуста.

Что не так с моим кодом? Я неправильно обрабатываю файл, вычисления переменных, синтаксис или что-то еще?

1 3

1 ответ:

with open(fname + ".txt", "w+") as f:

Открытие файла в режиме "w+" приводит к усечению файла, что означает удаление всего, что в нем находится. Все операции, выполняемые после этой инструкции, выполняются с пустым файлом.

Я бы предложил открыть файл в режиме чтения:

with open(fname + ".txt", "r") as f:

Загрузка файла в память, внесение изменений, а затем открытие файла в режиме "w+" и возврат файла обратно.

Давайте сделаем это на примере foo:

with open("foo.txt", 'r') as f: #open in read mode
    a = f.read().split(',') #breaking it apart so i can locate the 6th number easier
    a[6] = str(int(a[6]) + 2) #make my modifications
    a = ','.join(a) #convert it back to string
with open("foo.txt", 'w+') as f: #open in write and delete everything
    f.write(a) #write my modified version of the file

Обратите внимание, что это очень простой пример, поэтому он не принимает во внимание новые строки.