Python: как записать структуру данных в файл в виде текста (без засолки) - PullRequest
2 голосов
/ 03 октября 2009

Есть ли способ записать структуры данных Python в файл в виде текста.

например. приложение работает и имеет переменную / объект: OPTIONS = ('ON', 'OFF',)

Мне нужно записать / объединить кортеж OPTIONS в другой файл, а не как маринованный объект, но как текст, дословно: OPTIONS = ('ON', 'OFF',)

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

примечание: если я делаю "прямую" запись, я получаю следующее:

fout.write(OPTIONS)
 ... 
TypeError: argument 1 must be string or read-only character buffer, not tuple

Ответы [ 3 ]

4 голосов
/ 03 октября 2009

Вы можете использовать repr (repr хорошо работает с вещами, которые имеют метод __repr__()):

>>> OPTIONS=('ON', 'OFF', )
>>> "OPTIONS="+repr(OPTIONS)
"OPTIONS=('ON', 'OFF')"
1 голос
/ 03 октября 2009

Я не знаю вашу область, но вы могли бы использовать другую систему сериализации / персистентности, такую ​​как JSON или Twisted Jelly , которая более удобочитаема для человека (есть и другие, такие как YAML ).

Я использовал желе в некоторых проектах для файлов настроек. Это действительно удобно, но вы должны использовать repr (), чтобы сохранить данные в удобочитаемой форме, а затем eval (), чтобы прочитать их обратно. Так что не делайте этого на всех, потому что есть угроза безопасности с помощью eval ().

Вот пример кода, который подправляет представление (добавляет отступ):

VERSION = 'v1.1'

def read_data(filename):
    return unjelly(eval(open(filename, 'r').read().replace('\n', '').replace('\t', '')))

def write_data(filename, obj):
    dump = repr(jelly(obj))
    level = 0
    nice_dump = ['%s\n' % VERSION]
    for char in dump:
        if char == '[':
            if level > 0:
                nice_dump.append('\n' + '\t' * level)
            level += 1
        elif char == ']':
            level -= 1
        nice_dump.append(char)
    open(filename, 'w').write(''.join(nice_dump))
1 голос
/ 03 октября 2009

fout.write(str(OPTIONS)) делает то, что вы хотите в этом случае, но, несомненно, во многих других это не будет;repr вместо str может быть ближе к вашим желаниям (но, опять же, это может быть и не так, как вы их выражаете так смутно и обычно, за пределами этого единственного примера).

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