Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2012 13:27:55

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

Совершенно случайно наткнулся на непонятную ошибку. При выполнении кода

#!/usr/bin/python
# coding:utf-8
file = open("shmel.txt", "w")
for line in open("test.mpt"):
    s = line.split()
    if s[0]=="<note":
		k=s[2][5:]
		k=k[:(len(k)-1)]
		k=int(k)
		p=s[4][5:]
		p=p[:(len(p)-1)]
		p=int(p)		
		l=s[5][5:]
		l=l[:(len(l)-3)]
		l=int(l)
		file.write("%s %s %s\n"%(k,p,l))		
		print (k,p,l)
file.close()

строк получается на одну больше. И почему-то 17 снизу и 18 абсолютно одинаковые. Если бы в средине текста и не нашёл бы - голова кругом от чисел бы поехала.
Я уже на третьем питоне запускал - то же самое.
В чём дело и как бороться?
Исходный файл прилагаю:



Офлайн

#2 Июль 7, 2012 14:09:42

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

Ошибка при создании текстового файла

xml так не парсят:

#!/usr/bin/env python
#-*- coding: utf8 -*-

from lxml import etree

def parse_mpt(name):
root = etree.parse(name)
notes = root.xpath('//pattern/note')
return [(n.get('key'), n.get('pos'), n.get('len')) for n in notes]

parsed = parse_mpt('test.mpt')

buf = '\n'.join([' '.join(e) for e in parsed])

with open('shmel.txt', 'w') as fd:
fd.write(buf)

Офлайн

#3 Июль 7, 2012 15:21:15

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

s0rg
xml так не парсят:
Почему? А, если не xml? Ошибка всё-равно присутствует. Меня интересует причина ошибки, и она, явно, не в способе достижения цели. Тем более, что я случайно привёл пример с xml, которое меня волнует меньше, ибо xml - это лишь частный случай. Меня интересует общая картина, которая не меняется при любых форматах.



Отредактировано leonid_10 (Июль 7, 2012 15:22:07)

Офлайн

#4 Июль 7, 2012 15:54:50

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

leonid_10
При выполнении кода строк получается на одну больше. И почему-то 17 снизу и 18 абсолютно одинаковые. Если бы в средине текста и не нашёл бы - голова кругом от чисел бы поехала.

Может вы сформулируете нормально проблему?



Офлайн

#5 Июль 7, 2012 16:11:31

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

fata1ex
Может вы сформулируете нормально проблему?

В приложенном исходном файле строк с <note 888. После обработки и записи в файл строк становится 889. При этом производится повторная запись строчки 872. Эта строчка ничем не отличается от других 887 по своей структуре. Возможно, я с числами несколько ошибаюсь, но вопрос теперь сформулирован точно. В 15-20 сточках от низа полученного списка точно находятся две одинаковые строчки, которых в исходном файле нет и быть не может, вообще.



Офлайн

#6 Июль 7, 2012 16:26:34

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

Кстати, я сейчас проверил правильный скрипт от sOrg - та же самая ошибка. За строчкой 872 следует точная её копия, строчка 873
872: 52 10368 12
873: 52 10368 12



Офлайн

#7 Июль 7, 2012 16:45:20

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

Исходный файл:

          <note pan="0" key="52" vol="123" pos="10368" len="12"/>
<note pan="0" key="52" vol="123" pos="10368" len="12"/>

Результат:
52 10368 12
52 10368 12

Строк в исходном файле 889.



Отредактировано fata1ex (Июль 7, 2012 16:48:19)

Офлайн

#8 Июль 7, 2012 16:48:03

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

Ошибка при создании текстового файла

>grep "<note" test.mpt | wc -l
889
>python inp.py test.mpt | wc -l
889
#!/usr/bin/python
# coding:utf-8
c = 0
for line in open("test.mpt"):
    s = line.split()
    if s[0]=="<note":
        c += 1
print c
>python inp.py
889
По моему все сходится

За строчкой 872 следует точная её копия, строчка
52 10368 12
52 10368 12

=> test.mpt
945    <note pan="0" key="52" vol="123" pos="10368" len="12"/>
946 <note pan="0" key="52" vol="123" pos="10368" len="12"/>


Отредактировано EBFE (Июль 7, 2012 16:49:06)

Офлайн

#9 Июль 7, 2012 17:03:12

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

Чертовщина какая-то. Сейчас ещё раз проверю количество нот. Я весь день сегодня ухайдохал на поиск источника этого дубля. В ЛММС выбрасывал и по одной вставлял эти последние 20 нот.
Блин! Игры разума!

Всё, разобрался! По запарке удалил дубль в переименованном файле. Дописал несколько строчек, чтоб все дубли ликвидировать. Нот осталось 867, ура.
Приношу извинения за беспокойство!



Отредактировано leonid_10 (Июль 7, 2012 21:05:32)

Офлайн

#10 Июль 7, 2012 21:38:12

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Ошибка при создании текстового файла

leonid_10
Я весь день сегодня ухайдохал на поиск источника этого дубля.
Хорошая причина изучить готовые модули.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version