Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2017 09:12:42

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

evp24
а как?
как-то так:
 # coding: utf-8
 
import re
import sqlite3
import lxml.etree as ET
from datetime import datetime
from itertools import count
 
NAME = re.compile(ur'([\w-]+)\s+([\w-]+)\s*([\w\s-]*)', re.I + re.U)
 
 
def data_iter(root):
    for item in root.iter('item'):
        yield {i.tag: i.text for i in item}
 
 
def name_split(name):
    fam, im, ot = NAME.match(name.upper()).groups()
    return fam, im, ot
 
 
class _Database(object):
    def __init__(self):
        self.con = sqlite3.connect('data.db')
        self.cur = self.con.cursor()
        self.cur.execute(
            '''CREATE TABLE IF NOT EXISTS "patient" ( `id` INTEGER, `n5` TEXT, `n6` TEXT, `fam` TEXT, `im` TEXT, 
            `ot` TEXT, `drd` DATE, `drdy` TEXT, `lnkd` DATE, `smo_cod` INTEGER, PRIMARY KEY(`id`) )''')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_drd` ON `patient` (`drd` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_drdy` ON `patient` (`drdy` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_fam` ON `patient` (`fam` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_im` ON `patient` (`im` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_n6` ON `patient` (`n6` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_ot` ON `patient` (`ot` )')
        self.cur.execute('CREATE UNIQUE INDEX IF NOT EXISTS `ix_patient_primary_key` ON `patient` (`id` )')
        self.cur.execute('DELETE FROM `patient`')
 
    def append(self, rec):
        self.cur.execute("insert into `patient` values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", rec)
 
    def close(self):
        self.con.commit()
        self.cur.close()
 
 
def main(name):
    db = _Database()
    tree = ET.parse(name)
    root = tree.getroot()
    counter = count(1)
    for item in data_iter(root):
        fam, im, ot = name_split(item['attr_84896_'])
        dr = datetime.strptime(item['attr_84891_'], '%d.%m.%Y').date()
        dl = datetime.strptime(item['attr_84913_'], '%d.%m.%Y').date()
        db.append([
            counter.next(),
            '',
            item['attr_84895_'],
            fam, im, ot,
            dr,
            str(dr.year),
            dl,
            0,
        ])
    db.close()
 
 
if __name__ == '__main__':
    main('data.xml')

evp24
от WINDOWS отказался
На воду дуете.

Отредактировано Shaman (Июль 19, 2017 09:14:24)

Офлайн

#2 Июль 19, 2017 09:28:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

evp24
а как?
1. Надо понять сколько у вас данных. 100ТБ и 10 МБ требуют разных подходов. У меня сложилось мнение что данных у вас кот наплакал. Приведенный у вас файл с товарами в xml пара мегабайт. В этом случае проще вообще все данные затащить в память (если вам конечно не требуются продвинутые sql запросы). Если я ошибаюсь то последующие действия могут быть другими
2. Считываете данные из ваших xml при помощи пакета lxml или еще чего. - получаете dom.
3. Запросами к dom выковыриваете данные. и помещаете их в списки словарей (требует меньшего знания питона) или в таблицы пакета pandas, который и предназначен для работы с небольшими таблицами. На этом этапе данные можно сохранить в пиклы csv или еще как.
4. Разрабатыаете приложение для работы с данными, и соответственно выбираете способ хранения обновления При использовании надо оперативно изменять только малую часть данных, а не считывать и сохранять все, как требуется при импорте. Для этого как раз хорошо приспособлены базы данных.

p.s.
Во всей переписке я не увидел ни единого куска вашего кода. Не видно ни единого намека на то как вы потом собираетесь эти данные использовать. Поэтому складывается впечатление что вам проще нанять специалиста чем делать самим.
Печалька еще в том, что похоже полезных данных в приведенном вами xml практически нет. Только названия товаров похоже. Я не увидел как можно определить что на складе что в остатке и т.п. будьте готовы к тому что ничего полезного из этой затеи не выйдет.



Офлайн

#3 Июль 19, 2017 11:04:45

evp24
Зарегистрирован: 2017-05-03
Сообщения: 96
Репутация: +  3  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

doza_and
Надо понять сколько у вас данных. 100ТБ и 10 МБ

сам файл 3 мб. я его приложил выше

doza_and
Считываете данные из ваших xml при помощи пакета lxml или еще чего. - получаете dom.

Пробовал по этому примеру. Не получилось
выполняю код в netbeans ))

doza_and
не увидел как можно определить что на складе что в остатке и т.п. будьте готовы к тому что ничего полезного из этой затеи не выйдет.

Это главный файл, с товарами. Есть и другие
Цель, пока, понять, на НЕМ (как самом сложном)
как сделать то, что нужно. Научиться.

Отредактировано evp24 (Июль 19, 2017 11:13:49)

Офлайн

#4 Июль 19, 2017 11:09:37

evp24
Зарегистрирован: 2017-05-03
Сообщения: 96
Репутация: +  3  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

Shaman
как-то так:

попробовал поставить sqlite, пишет

[code ini]
~$ pip install sqlite3
Collecting sqlite3
Downloading sqlite3-99.0.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-z8SdZJ/sqlite3/setup.py", line 2, in <module>
raise RuntimeError("Package 'sqlite3' must not be downloaded from pypi")
RuntimeError: Package 'sqlite3' must not be downloaded from pypi

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-z8SdZJ/sqlite3/
[/code]

Офлайн

#5 Июль 19, 2017 11:13:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

evp24
а вы пробовали импортировать этот пакет? Не помню, чтобы мне хоть раз приходилось его устанавливать, он всегда шел с питоном по умолчанию.



Офлайн

#6 Июль 19, 2017 11:15:46

evp24
Зарегистрирован: 2017-05-03
Сообщения: 96
Репутация: +  3  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

FishHook
evp24а вы пробовали импортировать этот пакет? Не помню, чтобы мне хоть раз приходилось его устанавливать, он всегда шел с питоном по умолчанию.

Если делаю через python 3.5 выдает это

  File "/home/irip/test/py/PY/setup.py", line 9
NAME = re.compile(ur'([\w-]+)\s+([\w-]+)\s*([\w\s-]*)', re.I + re.U)
^
SyntaxError: invalid syntax

Офлайн

#7 Июль 19, 2017 11:19:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

evp24
Если делаю через python 3.5 выдает это
Ну и при чем тут sqlite3 вообще?



Офлайн

#8 Июль 19, 2017 11:24:00

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

evp24
Если делаю через python 3.5 выдает это
Пример на python2, который я обычно использую. Применение его как есть Вам точно не нужно.

Офлайн

#9 Июль 19, 2017 12:55:06

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

evp24
Пробовал по этому примеру. Не получилось
что именно?
 from lxml import etree
    
def get_node(node):
    print(node.tag,node.attrib,node.text)
    for n in node: get_node(n)
    
tree = etree.parse('DBSchema.xml')
get_node(tree.getroot())
выхлоп покажите
must read

Отредактировано vic57 (Июль 19, 2017 14:11:26)

Офлайн

#10 Июль 19, 2017 21:15:26

evp24
Зарегистрирован: 2017-05-03
Сообщения: 96
Репутация: +  3  -
Профиль   Отправить e-mail  

xml множество файлов в разных папках собрать воедино

vic57
выхлоп покажите

в 2.7 выдало:
Traceback (most recent call last):
File "/home/irip/test/py/xml/setup.py", line 1, in <module>
from lxml import etree
ImportError: No module named lxml


в 3.5 выдало:

Прикреплённый файлы:
attachment result_1 (55,4 KБ)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version