Альтернативные способы сохранения списка в файл в Python - PullRequest
0 голосов
/ 06 октября 2010

Я пытаюсь сохранить список в файл таким образом, чтобы при загрузке и чтении файла я снова получал списки.Другими словами, тип данных не изменяется при сохранении и загрузке.Потому что сейчас я использую «запись», чтобы сохранить свой список в файл, и когда я пытаюсь загрузить его обратно в память, я получаю строки, а не реальные списки.Есть ли способ конвертировать их обратно в списки после загрузки?или я должен изменить способ сохранения своих списков в файл. Обратите внимание, что я не хочу использовать Pickle.Спасибо РЕДАКТИРОВАТЬ: моя проблема с pickle заключается в том, что я должен шаг за шагом добавлять свои списки в разные части кода. Таким образом, у меня нет всех списков одновременно, поэтому я могу их перебирать.Это проблема, которая у меня была. Это дает мне неправильный ответ, я полагаю, это потому, что рассол требует всю информацию в одном месте и добавляет их в файл сразу.(?) В моих списках есть только целые числа.

Ответы [ 3 ]

4 голосов
/ 06 октября 2010

Если ваши данные представляют собой только список, элементы которого являются базовыми типами (например, str, unicode, int, float) и списки или типы, элементы которых и т. Д. И т. Д., То вы можете использовать json ; это переносимо на разные языки (это ваша проблема с рассолом?).

Обновление после того, как вопрос отредактирован "" ", моя проблема с pickle заключается в том, что мне нужно шаг за шагом добавлять свои списки в разные части кода" ""

Рассматривали ли вы собирать списки, чтобы их можно было травить по мере их нахождения, а затем собирать их все сразу в конце? То же самое относится и к json и т. Д. Все, что вам нужно, - это контейнер для хранения ваших списков. Вы можете сделать это лучше, поместив его в класс, например,

class Preserver(object):
    def __init__(self):
        self._bottle = []
    def add(self, an_object):
        self._bottle.append(an_object)
    def preserve(self, filepath):
        # code using pickle or json to push self._bottle
        # out to a file named "filepath"
1 голос
/ 06 октября 2010

Если вы доверяете вводу, используйте чтение файла и используйте eval :

>>> a_list = [1, 3, 5]
>>> with open('test.txt', 'w') as f:
...     f.write(str(a_list))
... 
>>> with open('test.txt') as f:
...     read_list = eval(f.readlines()[0])
... 
>>> read_list
[1, 3, 5]

Вы также можете использовать ast.literal_eval (python 2.6+), который безопаснее использовать, чем моя рекомендация eval.

Из документов:

Безопасно оценивать узел выражения или строка, содержащая Python выражение. Строка или узел при условии, может состоять только из следующие литеральные структуры Python: строки, числа, кортежи, списки, dicts, booleans и None.

Это можно использовать для безопасной оценки строки, содержащие выражения Python из ненадежных источников без нужно разобрать значения самостоятельно.

А например:

>>> import ast
>>> a_list = [1, 3, 5]
>>> with open('test.txt', 'w') as f:
...     f.write(repr(a_list))
... 
>>> with open('test.txt') as f:
...     read_list = ast.literal_eval(f.readlines()[0])
... 
>>> read_list
[1, 3, 5]
0 голосов
/ 06 октября 2010

Вы должны попробовать pyyaml ​​ добавленный бонус - это действительно текст для чтения человеком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...