Найти - Пользователи
Полная версия: Чтение из файла
Начало » Python для новичков » Чтение из файла
1
Duck-Pagan
Формирую список, который состоит из разного типа элементов: списки, строки, словари.
Сохраняю в файл:
with open ('C:\test-check.txt', 'w') as f:
    st = '::'.join(['%s' % i for i in checklist])
    f.write(st)
    f.close()

- Все просто. Так же элегантно восстанавливаю список из файла, говорю списку - ты список, а словарю - ты словарь:

with open ('C:\test-check.txt', 'rb') as f1:
    lines = f1.readlines()
    f.close()
    for i in range(len(lines)):
        line = str(lines[i])[2:-1].split('::')
        checklist.append([eval(line[j]) for j in range(len(line))])

но проблема в том, что: eval() + ‘string’ = bad
Подскажите, как в эту строку:
        checklist.append([eval(line[j]) for j in range(len(line))])
добавить проверку(т.е. я понимаю что дальше должен идти if\assert(о.. на сколько оправданно?), но не совсем понимаю как грамотно это реализовать, что даже если line - текст, он был добавлен в checklist) для исключения ошибки.
То что сохраняется просто - должно так же просто восстанавливаться, по логике.
EBFE
0. по моему
for line in lines
или
for line in f1
проще конструкций типа
for i in xrange(len(lines))

1. Желательно сохранять и восстанавливать “унитарно” - т.е open(…, ‘wb’).write(), open(…,'rb').read()

2. Свой, лично изобретённый, велосипед - это конечно круто
=>
http://docs.python.org/library/persistence.html
http://docs.python.org/library/pickle.html
http://docs.python.org/library/shelve.html
по поводу ‘eval + string = bad’
JSON
http://docs.python.org/library/json.html?highlight=json#json ( http://www.doughellmann.com/PyMOTW/json/ )
как раз поддерживает string, unicode, int, float, list, tuple, dict
или YAML

Пример с shelve:
>>> import shelve
>>> obj_db = shelve.open('test.db')
>>> test_list = [1,"foo",{'key':'value'},(10,20,30)]
>>> test_list
[1, 'foo', {'key': 'value'}, (10, 20, 30)]
>>> [type(t) for t in test_list]
[<type 'int'>, <type 'str'>, <type 'dict'>, <type 'tuple'>]
>>> obj_db['my_list'] = test_list
>>> obj_db.close()
>>> exit()

>python
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 6
32
Type "help", "copyright", "credits" or "license" for more i
>>> import shelve
>>> db = shelve.open('test.db')
>>> test_list = db['my_list']
>>> test_list
[1, 'foo', {'key': 'value'}, (10, 20, 30)]
>>> [type(t) for t in test_list]
[<type 'int'>, <type 'str'>, <type 'dict'>, <type 'tuple'>]
>>>
Edit:
по теме eval:
http://docs.python.org/library/ast.html#ast.literal_eval
Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.
>>> import ast
>>> ast.literal_eval('[1,2,3]')
[1, 2, 3]
>>> ast.literal_eval('{1:10}')
{1: 10}
>>> ast.literal_eval("open('somefile')")
Traceback (most recent call last):
...
ValueError: malformed string
>>>


reclosedev
EBFE
Желательно сохранять и восстанавливать “унитарно” - т.е open(…, ‘wb’).write(), open(…,'rb').read()
Все-таки, лучше с контекстным менеджером (with open). В CPython файлы, конечно, закроются сборщиком мусора, а вот в PyPy нет.
Или вы про атомарность записи? Тогда https://github.com/mitsuhiko/python-atomicfile , как вариант.

С остальным согласен, хороший подбор ссылок по хранению данных.
Duck-Pagan
EBFE, спасибо. Очень познавательно!
Shelve - порадовал.
EBFE
reclosedev
а вот в PyPy нет.
И в PyPy закроются . Просто в CPython сам сборщик мусора работает по принципу “reference counter” (подсчет ссылок ?) + cycle detector. A в PyPy “mark&sweep”. Т.е в СPythone как только будет вызован PY_DECREF (на выходе из функции и т.д), а в PyPy когда сборщик “снизойдет” до этого.

Насчет with итд. вообще не спорю - не стоит полагаться на специфические детали реализации (т.е что CPython сам сразу закроет файл)
Я вообще-то имел ввиду только режим открытия
w = write (по умолчанию: text)
rb = read binary

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB