Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Aristo
0 / 0 / 0
Регистрация: 26.01.2012
Сообщений: 3
#1

Запись в файл результата парсинга (SAX) - Python

26.01.2012, 20:51. Просмотров 2111. Ответов 4
Метки нет (Все метки)

Здравствуйте. Прошу прощения за беспокойство. Обращаюсь к вам по причине собственной ограниченности.
Дело вот в чем: Надо было распарсить xml с кодировкой cp1251 через SAX и записать результат в файл.
код xml для примера:
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="windows-1251" ?> 
- <main>
- <Данные>
<ДатаНачала>22.03.2011</ДатаНачала> 
</Данные>
</main>
код модуля:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import StringIO
from xml.sax.handler import ContentHandler
import xml.sax
 
class textHandler(ContentHandler):
 
def characters(self, ch):
output = StringIO.StringIO()
output.write(ch.encode("cp1251"))
print ch
try:
f = open('rez.txt','w')
f.write(handler)
finally:
f.close()
parser = xml.sax.make_parser()
handler = textHandler() 
parser.setContentHandler(handler)
parser.parse("new2.xml")
 
 
 
if __name__ == '__main__':
pass
в результате получаем строку:"

22.03.2011

"
и заново созданный, но условно пустой файл rez2.txt (там образуется пара - тройка пробелов)

P.S. использую SAX потому как файл очень большой и dom так быстро с ним не справится, а xml в примере лишь для примера.

Мне нужно разобраться что происходит, мое предположение:
make_parser передает в textHandler кусочки порционно, а не сливает все сразу и перезаписывает на место первой порции следующую, и т.д. и т.п. из-за этого мы видим лишь последний фрагмент, а именно несколько пробелов.

что сделать что бы он записывал результат целиком в файл?
http://www.cyberforum.ru/python/thread2252066.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 20:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запись в файл результата парсинга (SAX) (Python):

Запись результата в текстовый файл с кодировкой UTF-8
Всем доброго времени суток, Есть программа-тест, которая написана на...

Как выбрать текст из полученного результата парсинга
Доброго времени суток. Написал парсер, он должен собирать название заказов с...

Запись в файл
написал код в idle, сохранил, потом открываю через меню idle, как сделать так...

Запись в файл
Программа читает файл, там число строк и строки. строки перевернуть...

Запись в файл
Ошибка на стадии записи. Как правильно записать ? Так же вопрос по обработке:...

4
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2012, 06:59 #2
Для вставки кода в свои сообщения на форуме есть bb-теги [code][/code], [python][/python]
Цитата Сообщение от Aristo Посмотреть сообщение
Мне нужно разобраться что происходит, мое предположение:
make_parser передает в textHandler кусочки порционно, а не сливает все сразу и перезаписывает на место первой порции следующую, и т.д. и т.п. из-за этого мы видим лишь последний фрагмент, а именно несколько пробелов.
нет, потому, что у тебя при каждом вызове characters переменная output инициализируется заново (с помощью конструктора StringIO()). Да и вообще твой код выглядит как-то странно.
Кстати, ты так и не сказал, какие именно тебе данные нужно вытащить из файла. К примеру, если тебе нужно вытащить дату:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python3
 
from xml.sax import make_parser, handler
 
class DateHandler(handler.ContentHandler):
    def __init__(self, out):
        super().__init__()
        self.__out = out
        self.__date = False
 
    def startElement(self, name, attrs):
        if name == 'StartDate':
            self.__date = True
 
    def endElement(self, name):
        if name == 'StartDate':
            self.__date = False
 
    def characters(self, content):
        if self.__date:
            self.__out.write(content+'\n')
 
 
class Usage(Exception):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def __str__(self):
        return super().__str__() + \
            '\nUsage: xmplparser.py XML RESULT'
        
 
def run(argv):
    '''
    Функция принимает список из двух значений:
    1. Имя входного xml-файла
    2. Имя выходного файла
    '''
 
    try:
        if len(argv) != 2:
            raise Usage('Illegal number of arguments.'
                        ' Given {}; 2 expected'.format(len(argv)))
 
        parser = make_parser()
        
        with open(argv[0], 'r', encoding='cp1251') as xmlsource, \
                open(argv[1], 'w', encoding='cp1251') as result:
            parser.setContentHandler(DateHandler(result))
            parser.parse(xmlsource)
 
    except Exception as e:
        print(e, file=sys.stderr)
        return 1
        
if __name__ == '__main__':
    import sys
    sys.exit(run(sys.argv[1:]))
Пример использования
Код
[nameless@desktop python]$ cat content.xml
<?xml version="1.0" encoding="windows-1251" ?> 
<main>
  <Data>
    <StartDate>22.03.2011</StartDate>
    <StartDate>10.01.2012</StartDate>
    <StartDate>15.01.2012</StartDate>
  </Data>
</main>
[nameless@desktop python]$ ./xmlparser.py content.xml result.txt 
[nameless@desktop python]$ cat result.txt 
22.03.2011
10.01.2012
15.01.2012
[nameless@desktop python]$
0
Aristo
0 / 0 / 0
Регистрация: 26.01.2012
Сообщений: 3
27.01.2012, 09:11  [ТС] #3
"Данными" здесь выступает содержимое нодов (не атрибуты, а именно content, или, по другому наполнение). Нужно выдернуть их все из xml, но в последствии с возможным внедрением условия по имени <tag>.
Прошу прощения за странный вид кода, python'ом занялась недавно.
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2012, 12:13 #4
Aristo, ну я и привел пример, в котором вытаскивается содержимое нодов с именем (тегом) StartDate
0
Aristo
0 / 0 / 0
Регистрация: 26.01.2012
Сообщений: 3
27.01.2012, 14:32  [ТС] #5
это был ответ к :
Кстати, ты так и не сказал, какие именно тебе данные нужно вытащить из файла.
0
27.01.2012, 14:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2012, 14:32
Привет! Вот еще темы с решениями:

Запись в файл
Есть достаточно простой код,которые выводит то ,что надо,но в файл записывается...

Запись вывода в файл
Не могу понять в чем причина - не получается записать полученные ссылки в файл....

Запись байтов в файл
Открываю файл в байтовом режиме записываю в массив ascii-коды байтов,затем...

Запись значений в файл
Приветствую! Есть файл doc и надо чтобы программа находило слово и копировала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru