Python: загрузить текст как объект Python - PullRequest
1 голос
/ 30 августа 2010

У меня есть такой текст для загрузки: https://sites.google.com/site/iminside1/paste
Я бы предпочел создать словарь Python из него, но с любым объектом все в порядке. Я пробовал pickle, json и eval, но безуспешно. Вы можете помочь мне с этим?
Спасибо!
Результаты:

a = open("the_file", "r").read()

json.loads(a)
ValueError: Expecting property name: line 1 column 1 (char 1)

pickle.loads(a)
KeyError: '{'

eval(a)
File "<string>", line 19
from: {code: 'DME', airport: "Домодедово", city: 'Москва', country: 'Россия', terminal: ''},
    ^
SyntaxError: invalid syntax

Ответы [ 3 ]

4 голосов
/ 30 августа 2010

Поднят почти прямо со страницы примеров pyparsing :

<code># read text from web page
import urllib
page = urllib.urlopen("https://sites.google.com/site/iminside1/paste")
html = page.read()
page.close()

start = html.index("<pre>")+len("<pre>")+3 #skip over 3-byte header
end = html.index("
") text = html [start: end] печать текста # синтаксический анализ синтаксиса синтаксического анализа из импорта pyparsing (Suppress, Regex,quotedString, Word, альфа, алфавиты, oneOf, Forward, Optional, dictOf, delimitedList, Group, removeQuotes) LBRACK, RBRACK, LBRACE, RBRACE, COLON, COMMA = map (Suppress, "[] {} :,") integer = Regex(r "[+ -]? \ d +"). setParseAction (lambda t: int (t [0])) real = Regex (r "[+ -]? \ d + \. \ d *"). setParseAction (lambdat: float (t [0])) string_ = Word (альфа, алфавиты + "_") | quotedString.setParseAction (removeQuotes) bool_ = oneOf ("true false"). setParseAction (лямбда t: t [0] == "true ") item = Forward () ключ = string_ dict_ = LBRACE - необязательно (dictOf (ключ + COLON, item + необязательно (COMMA))) + RBRACE list_ = LBRACK - необязательно (delimitedList (item)) + RBRACK item << (real | integer | string_ | bool_ | Группа (list_ | dict_)) result = item.parseString (text, parseAll = True) [0] напечатать result.data [0] .dump () напечатать result.data [0] .segments[0] .dump (indent = "")напечатать result.data [0] .segments [0] .flights [0] .dump (indent = "-") напечатать result.data [0] .segments [0] .flights [0] .flightLegs [0] .dump(indent = "- -") для seg в result.data [6] .segments: для flt в seg.flights: fltleg = flt.flightLegs [0] print "% (авиакомпания) s% (авиакомпанияКод) s% (flightNo)) s "% fltleg, печать"% s ->% s "% (fltleg [" from "]. code, fltleg [" to "]. code)

Печать:

[['index', 0], ['serviceClass', '??????'], ['prices', [3504, ...
- eTicketing: true
- index: 0
- prices: [3504, 114.15000000000001, 89.769999999999996]
- segments: [[['indexSegment', 0], ['stopsCount', 0], ['flights', ... 
- serviceClass: ??????
  [['indexSegment', 0], ['stopsCount', 0], ['flights', [[['index', 0], ...
  - flights: [[['index', 0], ['time', 'PT2H45M'], ['minAvailSeats', 9], ...
  - indexSegment: 0
  - stopsCount: 0
  -  [['index', 0], ['time', 'PT2H45M'], ['minAvailSeats', 9], ['flight...
  -  - flightLegs: [[['flightNo', '309'], ['eTicketing', 'true'], ['air... 
  -  - index: 0
  -  - minAvailSeats: 9
  -  - stops: []
  -  - time: PT2H45M
  -  -  [['flightNo', '309'], ['eTicketing', 'true'], ['airplane', 'Boe... 
  -  -  - airline: ?????????
  -  -  - airlineCode: UN
  -  -  - airplane: Boeing 737-500
  -  -  - availSeats: 9
  -  -  - classCode: I
  -  -  - eTicketing: true
  -  -  - fareBasis: IPROW
  -  -  - flightClass: ECONOMY
  -  -  - flightNo: 309
  -  -  - from:   -  -  [['code', 'DME'], ['airport', '??????????'], ... 
  -  -    - airport: ??????????
  -  -    - city: ??????
  -  -    - code: DME
  -  -    - country: ??????
  -  -    - terminal: 
  -  -  - fromDate: 2010-10-15
  -  -  - fromTime: 10:40:00
  -  -  - time: 
  -  -  - to:   -  -  [['code', 'TXL'], ['airport', 'Berlin-Tegel'], ... 
  -  -    - airport: Berlin-Tegel
  -  -    - city: ??????
  -  -    - code: TXL
  -  -    - country: ????????
  -  -    - terminal: 
  -  -  - toDate: 2010-10-15
  -  -  - toTime: 11:25:00
airBaltic BT 425 SVO -> RIX
airBaltic BT 425 SVO -> RIX
airBaltic BT 423 SVO -> RIX
airBaltic BT 423 SVO -> RIX

РЕДАКТИРОВАТЬ : исправлена ​​группировка и расширенный дамп вывода, чтобы показать, как получить доступ к отдельным ключевым полям результатов, либо по индексу (в списке), либо как атрибуту (в пределах dict).

3 голосов
/ 30 августа 2010

Если вам действительно нужно загрузить быков ... это данные (см. Мой комментарий), вы, вероятно, лучше всего с регулярным выражением, добавляющим пропущенные кавычки. Что-то вроде r"([a-zA-Z_][a-zA-Z_0-9]*)\s*\:", чтобы найти что-то, что можно заменить и r"\'\1\'\:" в качестве замены (мне нужно сначала проверить это) .

Редактировать: После некоторой проблемы с обратными ссылками в Python 3.1 я наконец-то начал работать с этими:

>>> pattern = r"([a-zA-Z_][a-zA-Z_0-9]*)\s*\:"
>>> test = '{"foo": {bar: 1}}'
>>> repl = lambda match: '"{}":'.format(match.group(1))
>>> eval(re.sub(pattern, repl, test))
{'foo': {'bar': 1}}
0 голосов
/ 30 августа 2010

До сих пор с помощью delnan и небольшим исследованием я могу загрузить его в dict с помощью eval:

pattern = r"\b(?P<word>\w+):"
x = re.sub(pattern, '"\g<word>":',open("the_file", "r").read())
y = x.replace("true", '"true"')
d = eval(y)

Все еще ищу более эффективное и, возможно, более простое решение ... Я не люблю использовать "eval" по некоторым причинам.

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