Уведомления

Группа в Telegram: @pythonsu

#1 Март 3, 2009 14:26:34

gelo
От:
Зарегистрирован: 2009-03-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Раобта со строками

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

BONGO 
NAME text
TYPE tozeText
FILTER kakojnitTip
END
...
...
[всякая всячина]
...
...
BONGO
NAME text2
TYPE tozeText2
FILTER kakojnitTip2
END
]

BONGO всегда заканчивается словом END, и таких кусков в файле множество. А задача следующая:

Найти блок начинающийся словом БОНГО, определить текст в константе NAME, и если текст соответствует требуемому, куданить его записать. А если не соответствует то идти искать следующий код BONGO …. END

Я вот никак не могу понят принцип посика слов, и как мне поблочно (BONGO / END) передвигаться в файле.


Буду признателен за любой совет.

Что касается документации, читал, анго и русскоязычную но так и не понял :(

Олег



Офлайн

#2 Март 3, 2009 14:38:18

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Раобта со строками

Тут дело не в документации, а в логике :)
Нет таких волшебных функций, на все случаи жизни, которые делают именно то что нужно.
“в лоб”:

for x in text.split('BONGO')[1:]:
print x.split('END')[0].split('NAME ')[1].split('\n')[0]
Уверен, что кто нибудь предложит и более элегантное решение, а потом еще кто нибудь предложит еще одно решение, а потом кто нибуть на регулярках напишет код :)



Отредактировано (Март 3, 2009 14:47:03)

Офлайн

#3 Март 3, 2009 15:57:30

gelo
От:
Зарегистрирован: 2009-03-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Раобта со строками

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

я тут пробовал через операторы for if else

#!/usr/bin/python

fo = open("profile.brr", "r")
tx = fo.xreadlines()

var_lay = "LAYER"
var_data = "DATA"
var_tile = "TILEINDEX"
var_type = "TYPE"

for line in tx:
if line.startswith(var_lay):
fo.readline() тут не знаю как писать :(
if line.startswith(var_type):
print ' '
else:
print ' '
else:
print ' '
только не уверен если я иду в правильном направлении



Офлайн

#4 Март 4, 2009 00:33:13

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Раобта со строками

содержимое файла in.txt

BONGO 
BONG
NAME text2
TYPE tozeText2
FILTER kakojnitTip2
END
fds
fs
df
sdf
sdf
sd
f
sdf
s
dfsdfsd
BONGO
BONG
NAME tedsdsxt2
TYPE tozeText2
FILTER kakojnitTip2
END
скрипт:
import re

s = re.findall(r'BONGO(?:(?!BONGO|END).)+NAME\s*([^\n\r]+)(?:(?!BONGO|END).)+END', open('in.txt').read(), re.S)
содержимое s:
['text2', 'tedsdsxt2']



Офлайн

#5 Март 4, 2009 03:28:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Раобта со строками

Генераторы - наше все.

s = '''
BONGO
BONG
NAME text2
TYPE tozeText2
FILTER kakojnitTip2
END
fds
fs
df
sdf
sdf
sd
f
sdf
s
dfsdfsd
BONGO
BONG
NAME tedsdsxt2
TYPE tozeText2
FILTER kakojnitTip2
END
'''

def parser():
result = None
while True:
line = yield result
result = None
line = line.strip()
if line.startswith('BONGO'):
block = []
name = None
while True:
block.append(line)
line = yield None
line = line.strip()
if line.startswith('NAME'):
const, text = line.split()
name = text
if line.startswith('END'):
result = (name, block)
break


p = parser()
p.send(None)
for line in s.split('\n'):
ret = p.send(line)
if ret:
print ret
Output:
('text2', ['BONGO', 'BONG', 'NAME text2', 'TYPE tozeText2', 'FILTER  kakojnitTip2'])
('tedsdsxt2', ['BONGO', 'BONG', 'NAME tedsdsxt2', 'TYPE tozeText2', 'FILTER kakojnitTip2'])
Обратите внимание, что обработчик найденого блока может быть куда более сложным



Офлайн

#6 Март 4, 2009 12:50:48

kostyasa
От:
Зарегистрирован: 2008-12-15
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Раобта со строками

регулярные выражения конечно рулят, но я их еще не юзал, а вот словари - уже успел ))

ap = open('./1.txt','r').read()

mydict = ['text','text2']
ok = {}
for i in range(len(ap.split('BONGO'))):
if ap.split('BONGO')[i] == '': continue
sp = ap.split('BONGO')[i].split('END')[0].strip()
text = {}
for i2 in sp.split('\n'):
i2 = i2.strip()
if filter(lambda x:i2.startswith(x),'NAME'):
name = i2.split(' ')[1]
if name in mydict:
ok.setdefault(name,[])
continue
infa = i2.split(' ')[1]
if infa == '':
try:
infa = i2.split(' ')[2]
except:
infa = 'not data'
text.setdefault(i2.split(' ')[0],[])
text[i2.split(' ')[0]] = infa
ok[name] = text

for k,v in ok.items():
print k,v



Офлайн

#7 Март 5, 2009 15:59:25

Новичек
От:
Зарегистрирован: 2009-03-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Раобта со строками

Привет всем. Я толко начал изучать Python. У меня есть книга “Язык Python для начинающих”, в ней есть начальные примеры, и от один из них который мне не удаётса выполнить: Разкройте окно своего редактора (текстовый редактор Блокнот) и введите следующий код:

print "Hello, World"
print "Goodbye, World"
Сохраните ети строки в текстовом файле под названием helloworld.py, откройте окно DOS (или другое окно терминала) и сделайте текущим тот каталог, где вы сохранили файл. Введите в окне терминала строку python helloworld.py и посмотрите, что произойдет. Должно получитса
Hello, World
Goodbye, World
А у меня
  File "<stidn>", line 1  
c:\test\python helloworld.py
^
SyntaxError: invalid syntax
В чем проблема незнаю.( Может нехватает чегото? Help



Отредактировано (Март 5, 2009 16:12:55)

Офлайн

#8 Март 5, 2009 16:22:45

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Раобта со строками

Сейчас угадаю… У тебя python 3.x а примеры для python 2.x
Для python 3 нужно

print('hello world')
Мои совет, начни изучение с 2.6.1, все примеры подойдут.
P.S. Эх… Как и ожидалось, сыпятся вопросы от новичков по поводу python 3



Отредактировано (Март 5, 2009 16:23:27)

Офлайн

#9 Март 5, 2009 16:30:29

Новичек
От:
Зарегистрирован: 2009-03-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Раобта со строками

igor.kaistВообще то примеры для 1.5.2)))) А у меня есть 3.0.1 и 2.5.0



Офлайн

#10 Март 5, 2009 16:33:43

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Раобта со строками

Новичек
File “<stidn>”, line 1 c:\test\python helloworld.py ^ SyntaxError: invalid syntax
Все круче - Новичек пытается запустить питон из питоновского же шелла, хотя нужно из коммандной строки.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version