Как открыть маринованный файл в режиме чтения и записи одновременно в python? - PullRequest
1 голос
/ 31 марта 2020

Как открыть маринованный файл в режиме чтения и записи одновременно в python? Есть ли способ сделать это или это невозможно.

Ответы [ 3 ]

1 голос
/ 31 марта 2020

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

import pickle

try:
    with open("my_pickle.file", "rb+") as pickle_file:
        mylist = pickle.load(pickle_file)
        mylist = [i * 2 for i in mylist]
        pickle_file.seek(0)
        pickle.dump(mylist, pickle_file)
        print(mylist)
except FileNotFoundError as fnfe:
    with open("my_pickle.file", "wb") as pickle_file:
        pickle.dump([1, 2, 3], pickle_file)

при запуске этого сценария 5 раз, при первом создании маринованного объекта в следующие 4 раза он удваивает значения в списке

OUTPUT

[1, 2, 3]
[2, 4, 6]
[4, 8, 12]
[8, 16, 24]
[16, 32, 48]

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

1 голос
/ 31 марта 2020

Невозможно.

Для этого откройте 2 файловых указателя, один для чтения, а другой для записи. Для указателя записи назовите его «file.tmp» или что-то в этом роде. После записи в этот файл вы можете заменить другой файл новым file.tmp файлом. Psuedocode это:

f1 = open('hello.txt', 'r')
f2 = open('hello.txt.tmp', 'w')

f1_contents = f1.read()
# do something with f1_contents
f2.write(f1_contents)

f1.close(); f2.close()

import os
os.rename('hello.txt.tmp', 'hello.txt')
0 голосов
/ 31 марта 2020

вам нужно больше информации о том, чего вы хотите достичь.

Было бы сложно правильно прочитать файл маринования с более чем одним объектом - вы должны были бы сохранить боковую структуру с включенными индексами начало и конец объектов.

В целом, проще использовать sqlite3, создать с ним файл базы данных с одной таблицей (назовите ее «pickles»), которая может содержать только два столбца: один идентификатор для ваших засоленных объектов и Сам сериализованный объект.

...