Найти - Пользователи
Полная версия: Чтение из файла
Начало » Python для новичков » Чтение из файла
1
Sprouttie
Проблема, наверно имеет простое решение, но я бьюсь полдня и не могу его найти. Программа форматирует текст и создаёт списки с вложенными списками. Это я выгружаю в текстовый файл.
Получается нужный мне формат: [[,],]]
ПРОБЛЕМА: Читаю этот файл в другой программе
f = open('Draw.txt', 'r')
Draw=f.read()
f.close()
и получаю строку "[[,],]]"
И что бы я ни предпринимал, пытаясь обратить строку обратно в список, не могу избавиться от злополучных кавычек… Пробовал создать список по новой:
inp = open('Draw.txt', 'r')
d = inp.read()
a=[]
for i in range (len(d)):
    a.append(d[i])
inp.close()
Но там полное издевательство: Как в песне у Высоцкого: “Каждый член у меня расфасованный…”
каждый элемент в отдельных кавычечках…
СПАСИТЕ!
4kpt_IV
Однострочное выражение: eval
Многострочное выражение: exec
Но так лучше не делать. Гляньте в сторону shelve. Или сразу по-взрослому в сторону SQL или NoSQL баз данных.
Sprouttie
С таким же успехом: Бамбарбия! и Кергуду! )))
Классный совет! Благодарю!
Я добросовестно проверил , что пишется о eval и не обнаружил связи с моей проблемой. По крайней мере совет точно не для новичка.
py.user.next
Sprouttie
Программа форматирует текст и создаёт списки с вложенными списками. Это я выгружаю в текстовый файл.
Нельзя списки питона сохранять в файл в виде текста, потому что теоретически отображение списков в питоне может измениться и все такие программы сразу посыпятся.
Можешь использовать модуль json, он похож на списки.

>>> import json
>>> 
>>> json.dumps([[1, 2], [3, 4]])
'[[1, 2], [3, 4]]'
>>> 
>>> s = _
>>> s
'[[1, 2], [3, 4]]'
>>> 
>>> json.loads(s)
[[1, 2], [3, 4]]
>>>

Для полной сериализации (с любыми объектами) используй модуль pickle.
>>> import pickle
>>> 
>>> class A(int): pass
... 
>>> a = A(1)
>>> b = A(2)
>>> lst = [a, b, a, b]
>>> 
>>> pickle.dumps(lst)
b'\x80\x03]q\x00(c__main__\nA\nq\x01K\x01\x85q\x02\x81q\x03h\x01K\x02\x85q\x04\x81q\x05h\x03h\x05e.'
>>> 
>>> pickle.loads(_)
[1, 2, 1, 2]
>>> 
>>> obj = _
>>> obj[0]
1
>>> type(obj[0])
<class '__main__.A'>
>>>
PooH
py.user.next
Нельзя списки питона сохранять в файл в виде текста, потому что теоретически отображение списков в питоне может измениться и все такие программы сразу посыпятся.
Я дико извиняюсь, но если синтаксис списков в питоне изменится то посыпятся все программы ;)
JOHN_16
PooH
а если астероид упадет на Землю, то до списков никому не будет дела…я к тому что бессмысленно подобные изречения выдавать. Мы все общаемся в рамках разумного, синтаксис списков менять не зачем, предположу что даже гипотетически.
Модуль json решит проблемы.
Sprouttie
Можешь использовать модуль json
Спасибо! То,что надо! О кодировании и декодировании через этот модуль прочитал здесь:
модуль json.
py.user.next
PooH
Я дико извиняюсь, но если синтаксис списков в питоне изменится то посыпятся все программы ;)
Имеется в виду repr() и str().

То, что eval() преобразует обратно строковое представление списка, нигде не определено.
>>> class A: pass
... 
>>> lst = [1, 2, A()]
>>> 
>>> str(lst)
'[1, 2, <__main__.A object at 0xb73cf0cc>]'
>>> 
>>> eval(_)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    [1, 2, <__main__.A object at 0xb73cf0cc>]
           ^
SyntaxError: invalid syntax
>>>
Допустим, мы видим, что список в строковом представлении начинается с квадратной скобки, но где это определено? А почему он не может начинаться с какой-нибудь последовательности типа “list(” ?
Поэтому программы, которые опираются на строковое представление списка и используют его для точного представления данных, рискуют попасть в эпоху изменений, где кто-нибудь скажет “давайте поменяем представления, у нас стало больше разновидностей обычных списков”.
PooH
JOHN_16
я к тому что бессмысленно подобные изречения выдавать. Мы все общаемся в рамках разумного, синтаксис списков менять не зачем, предположу что даже гипотетически.
в сообщении py.user.next предполагалась что это возможно. Лопата!
PooH
py.user.next
PooH
Я дико извиняюсь, но если синтаксис списков в питоне изменится то посыпятся все программы ;)
Имеется в виду repr() и str().
Да я понял, просто пошутил
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