Какой хороший формат временного хранения и транспорта для Python? - PullRequest
3 голосов
/ 19 октября 2011

Я пишу скрипт на Python, который будет выдавать некоторые данные, организованные в виде списка диктов:

[{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon' },
 {'name': 'second_thing', 'color': 'red' },
 {'name': 'third_thing', 'color': 'blue', 'size': 'huge!' }]

Я пытаюсь выбрать способ хранения этих данных в файле.Мои соображения:

  1. Мне бы хотелось, чтобы его было так же легко читать, как писать, чтобы я мог загрузить данные обратно в сценарий и манипулировать ими дальше.
  2. I 'Мне бы хотелось, чтобы это был не специфичный для Python формат.Может быть, позже я захочу использовать эти данные в PHP или еще что-нибудь, кто знает?
  3. Я бы хотел, чтобы это был формат, к которому легко добавить больше данных.Если в моем файле есть список из 1000 моих маленьких элементов dict, я не хочу загружать все 1000 в память, просто чтобы добавить еще один элемент в конец.

Моя первая попытка состояла в том, чтобыиспользуйте Pickle, который соответствует простым критериям, но он зависит от Python, и мне пришлось бы открывать, дописывать, затем повторять.

Другие форматы, которые я думал, кажутся выполнимыми (с моими возражениями):

  • JSON (добавление будет раздражать, может быть)
  • Полка (специфичная для Python)
  • CSV (как клейкая лента, не такая стильная, но вероятно,работа)
  • Какая-то легкая база данных, такая как sqlite (может быть, здесь слишком модно)

У кого-нибудь есть аргументы для какого-либо из этих или другого формата?

Ответы [ 4 ]

2 голосов
/ 19 октября 2011

Рассол должен работать нормально.Сохраните тексты напрямую (не в списке), чтобы упростить добавление:

>>> from pickle import dump, load
>>> f = open('stor.bin', 'w')
>>> dump(dict(a=1), f)
>>> dump(dict(b=2), f)
>>> dump(dict(c=3), f)
>>> f.close()

В последующих сеансах добавьте другой дамп () непосредственно в конец файла:

>>> f = open('store.bin', 'a')
>>> dump(dict(d=4), f)
>>> f.close()   

Чтобы прочитать, просто выполняйте load (), пока не дойдете до конца файла:

>>> f = open('stor.bin', 'r')
>>> load(f)
{'a': 1}
>>> load(f)
{'b': 2}
>>> load(f)
{'c': 3}
>>> load(f)
{'d': 4}
>>> load(f)

Traceback (most recent call last):
   ...
EOFError
1 голос
/ 19 октября 2011

Учитывая необходимость добавления данных позже, YAML может быть форматом, который вы ищете. Он разработан специально для поддержки добавленных элементов данных, таких как файл журнала, json намеренно является подходящим подмножеством языка и имеет некоторую полезную мета-разметку, предназначенную для мощной межязыковой сериализации пользовательских классов.

1 голос
/ 19 октября 2011

В большинстве случаев я думаю, что JSON должен быть вашим лучшим выбором.

Используйте simplejson для преобразования вашего списка из dict в JSON, это будет так просто:

import simplejson as json
my_list = [{'name': 'first_thing', 'color': 'blue', 'flavour': 'watermelon'}, {'name': 'second_thing','color': 'red' }, {'name': 'third_thing', 'color': 'blue', 'size': 'huge!'}]
output = json.dumps(my_list, ident=4)

Результат JSON будет:

[
    {
        "color": "blue",
        "flavour": "watermelon",
        "name": "first_thing"
    },
    {
        "color": "red",
        "name": "second_thing"
    },
    {
        "color": "blue",
        "name": "third_thing",
        "size": "huge!"
    }
]

Теперь этот JSON является совершенно корректной строкой JSON.

Это массив JSON . Поэтому я не думаю, что вам нужно взломать, чтобы удалить "[" и "]". Так как вы передаете список Python для SimpleJSON, вы получите список JSON обратно.

0 голосов
/ 19 октября 2011

Из вашего примера фрагмента данных, похоже, ваши данные соответствуют табличному формату лучше, чем более сложные форматы. Если ключи ваших диктовок известны заранее и используются в каждой записи, я думаю, что CSV - правильный выбор. В Python также есть модуль CSV, чтобы сделать это проще.

...