Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2012 17:18:26

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

Укажите на ошибки!

Скрипт принимает файл строк такого вида:

1 the - определенный артикль
2 be v - быть
3 of - предлог родительного падежа

разбирает его и генерирует xml такого вида:

<meewords>
<words>
<word>
the
</word>
<translation>
определенный артикль
</translation>
</words>
<words>
<word>
be
</word>
<translation>
быть
</translation>
</words>
<words>
<word>
of
</word>
<translation>
предлог родительного падежа
</translation>
</words>
from xml.dom import minidom

class Pars():
def run(self):
counter=0
for self.wrd in open(self.fal1):
self.s = self.wrd.split(' ')
del self.s[0]
if self.s[-1] == '\n':
del self.s[-1]
if self.s[1] == 'n' or self.s[1] == 'v':
del self.s[1]
self.s=' '.join(self.s)
self.i = self.s.find('-')
counter=counter+1
print 'processing words', counter
self.runXml()


class DomXml(Pars):
def __init__(self):
self.dom = minidom.Document()
self.a1 = self.dom.createElement("meewords")
self.dom.appendChild(self.a1)

def runXml(self):
self.b1 = self.dom.createElement("words")
self.a1.appendChild(self.b1)
self.c1 = self.dom.createElement("word")
self.c1.appendChild(self.dom.createTextNode(self.s[0:self.i]))
self.c2 = self.dom.createElement("translation")
self.c2.appendChild(self.dom.createTextNode(self.s[self.i + 1:]))
self.b1.appendChild(self.c1)
self.b1.appendChild(self.c2)
self.save()

class Start(DomXml):
def __init__(self, fal1, fal2):
DomXml.__init__(self)
self.fal1 = fal1
self.fal2 = fal2
self.run()

def save(self):
self.res = open(self.fal2, 'w')
self.res.writelines(self.dom.toprettyxml())
self.res.close()



Офлайн

#2 Март 11, 2012 17:30:02

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Укажите на ошибки!

if self.s[-1] ==  '\n':
del self.s[-1]
Такого я еще не видел, код не читал - эти строки заставили меня задуматься о многом.

Офлайн

#3 Март 11, 2012 17:47:22

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

Укажите на ошибки!

а как правильно избавиться от символа новой строки?



Офлайн

#4 Март 11, 2012 18:14:36

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

Укажите на ошибки!

str.strip() вроде б :)

Офлайн

#5 Март 11, 2012 20:00:46

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

Укажите на ошибки!

Так лучше?))

class Pars():
def run(self):
counter=0
for self.s in open(self.fal1):
self.s = self.s.split(' ')
del self.s[0]
if 'n' in self.s: del self.s[self.s.index('n')]
if 'v' in self.s: del self.s[self.s.index('v')]
self.s = ' '.join(self.s)
self.s = self.s.strip()
self.i = self.s.find('-')
counter+=1
print 'processing words', counter
self.runXml()



Отредактировано (Март 11, 2012 20:48:52)

Офлайн

#6 Март 12, 2012 04:33:21

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Укажите на ошибки!

Так точно будет лучше :)

from xml.dom import minidom

def parse(infile):
with open(infile, "r") as f:
for p1, p2 in ([_.strip() for _ in l.split("-")] for l in f if l.strip()):
if p1.endswith(" n") or p1.endswith(" v"):
p1 = p1[:-2]
_, p1 = p1.split(" ", 1)
yield p1, p2

def create_xml(words, outfile):
xml = minidom.Document()
root = xml.createElement("meewords")
xml.appendChild(root)

for w, t in words:
node = xml.createElement("words")
root.appendChild(node)

x = xml.createElement("word")
node.appendChild(x)
x.appendChild(xml.createTextNode(w))

x = xml.createElement("translation")
node.appendChild(x)
x.appendChild(xml.createTextNode(t))

with open(outfile, "w") as f:
f.write(xml.toprettyxml())

if "__main__" == __name__:
create_xml(parse("text.txt"), "out.xml")



Офлайн

#7 Март 12, 2012 08:13:34

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

Укажите на ошибки!

спасибо! пошел учиться!



Офлайн

#8 Март 12, 2012 19:53:33

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

Укажите на ошибки!

pyuser
some - несколько, какой-то

raceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
for p1, p2 in ([_.strip() for _ in l.split("-")] for l in f if l.strip()):
ValueError: too many values to unpack



Офлайн

#9 Март 12, 2012 20:41:26

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Укажите на ошибки!

do_strip = lambda a: a.strip()

def parse(infile):
with open(infile) as f:
for line in filter(bool, map(do_strip, f)):
p1, p2 = map(do_strip, line.split('-'))
if p1.endswith((' n', ' v')):
p1 = p1[:-2]
p1 = p1.split(' ', 1)[1]
yield p1, p2

Офлайн

#10 Март 13, 2012 01:46:33

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Укажите на ошибки!

Malinaizer
pyuser
some - несколько, какой-то

raceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
for p1, p2 in ([_.strip() for _ in l.split("-")] for l in f if l.strip()):
ValueError: too many values to unpack
Достаточно заменить l.split(“-”) на l.split(“-”, 1)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version